Couchbase 全文搜索和复合键
Couchbase full-text search and compound keys
我在 Couchbase 中有以下数据:
文档 06001
:
{
"type": "box",
"name": "lxpag",
"number": "06001",
"materials": [
{
"type": "material",
"number": "070006",
"name": "hosepipe"
},
{
"type": "material",
"number": "080006",
"name": "Philips screw 4mm"
},
}
文档 12345
:
{
"type": "material",
"number": "12345",
"name": "Another screw"
}
现在我希望能够按类型和名称或编号进行查询:对于给定的查询类型,仅应返回相应类型 属性 的文档。此外,第二个查询字符串指定应搜索哪种类型的 material。如果 material 的 id 或名称 包含 (不是以其开头)搜索词,则应将其包含在内。如果方框内的 material 之一与相应的术语匹配,则应包括整个方框。
我想出的是:
function (doc, meta) {
if (doc.type === 'box' && Array.isArray(doc.materials)) {
var queryString = "";
for (i = 0; i < doc.materials.length; ++i) {
var material = doc.materials[i];
if (material.name && material.number) {
queryString += " " + material.name + " " + material.number;
}
}
emit([doc.type, queryString], doc);
} else if (doc.type === 'material') {
var queryString = doc.name + " " + doc.number;
emit([doc.type, queryString], doc);
}
}
我发现此视图可能不适合子字符串搜索(为此我需要 ElasticSearch 吗?)。尽管如此,当我使用以下查询参数时:
startKey=["box","pag"]&endKey=["box\u02ad","pag\u02ad"]
...我不仅得到了盒子,还得到了视图返回的所有其他文档。因此,使用这些键,不会过滤任何内容。另一方面,按 key
搜索有效。
这怎么可能?
我刚刚看到查询中的缺陷:参数必须用小写字母书写,否则 Couchbase 无法识别并忽略它们(如果我在这里得到错误消息而不是通常的结果列表,那将非常有帮助...)。所以相反,我必须查询
startKey=["box","pag"]&endKey=["box\u02ad","pag\u02ad"]
到目前为止我还没有确切地发现如何管理子字符串搜索。由于 pag
是 lxpag
的子字符串,上述查询不会 return 任何结果。有什么想法没关系吗?
没有使用视图键进行子字符串搜索的好方法。您的选择是与 ElasticSearch 集成,或使用 N1QL,它允许您进行通配符字符串匹配:"SELECT * FROM bucket WHERE type = 'material' and name LIKE '%screw%'"
我在 Couchbase 中有以下数据:
文档 06001
:
{
"type": "box",
"name": "lxpag",
"number": "06001",
"materials": [
{
"type": "material",
"number": "070006",
"name": "hosepipe"
},
{
"type": "material",
"number": "080006",
"name": "Philips screw 4mm"
},
}
文档 12345
:
{
"type": "material",
"number": "12345",
"name": "Another screw"
}
现在我希望能够按类型和名称或编号进行查询:对于给定的查询类型,仅应返回相应类型 属性 的文档。此外,第二个查询字符串指定应搜索哪种类型的 material。如果 material 的 id 或名称 包含 (不是以其开头)搜索词,则应将其包含在内。如果方框内的 material 之一与相应的术语匹配,则应包括整个方框。
我想出的是:
function (doc, meta) {
if (doc.type === 'box' && Array.isArray(doc.materials)) {
var queryString = "";
for (i = 0; i < doc.materials.length; ++i) {
var material = doc.materials[i];
if (material.name && material.number) {
queryString += " " + material.name + " " + material.number;
}
}
emit([doc.type, queryString], doc);
} else if (doc.type === 'material') {
var queryString = doc.name + " " + doc.number;
emit([doc.type, queryString], doc);
}
}
我发现此视图可能不适合子字符串搜索(为此我需要 ElasticSearch 吗?)。尽管如此,当我使用以下查询参数时:
startKey=["box","pag"]&endKey=["box\u02ad","pag\u02ad"]
...我不仅得到了盒子,还得到了视图返回的所有其他文档。因此,使用这些键,不会过滤任何内容。另一方面,按 key
搜索有效。
这怎么可能?
我刚刚看到查询中的缺陷:参数必须用小写字母书写,否则 Couchbase 无法识别并忽略它们(如果我在这里得到错误消息而不是通常的结果列表,那将非常有帮助...)。所以相反,我必须查询
startKey=["box","pag"]&endKey=["box\u02ad","pag\u02ad"]
到目前为止我还没有确切地发现如何管理子字符串搜索。由于 pag
是 lxpag
的子字符串,上述查询不会 return 任何结果。有什么想法没关系吗?
没有使用视图键进行子字符串搜索的好方法。您的选择是与 ElasticSearch 集成,或使用 N1QL,它允许您进行通配符字符串匹配:"SELECT * FROM bucket WHERE type = 'material' and name LIKE '%screw%'"