我在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"
}现在,我希望能够按类型、名称或数字进行查询:对于给定的查询类型,将只返回具有相应类型属性的文档。此外,第二个查询字符串指定应该搜索哪种材料。如果材料的id或名称包含(而不是以搜索词开头),则应包括该名称。如果盒子内的材料之一与该术语相匹配,则应包括整个盒子。
我想出的是:
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"]...not只获取框,但也得到视图返回的所有其他文档。因此,有了这些键,就不会过滤任何内容。另一方面,key的搜索是有效的。
这怎麽可能?
发布于 2015-07-09 14:10:04
没有使用视图键进行子字符串搜索的好方法。您的选项要么与ElasticSearch集成,要么使用N1QL,它允许您执行通配符字符串匹配:"SELECT * FROM其中类型=‘either’并命名为‘%螺杆%’“
发布于 2015-07-09 08:18:18
我刚刚看到了查询中的缺陷:参数必须用小写写,否则Couchbase就不能识别它们,而忽略它们(如果我在这里得到错误消息,而不是通常的结果列表.)。所以,我不得不用
startKey=["box","pag"]&endKey=["box\u02ad","pag\u02ad"]到目前为止,我还没有确切地发现如何管理子字符串搜索。因为pag是lxpag的子字符串,所以上面的查询不会返回任何结果。有什么想法吗这件事?
https://stackoverflow.com/questions/31297032
复制相似问题