1

我在 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"]

...我不仅得到了盒子,还得到了视图返回的所有其他文档。因此,使用这些键,不会过滤任何内容。另一方面,按key作品搜索。

这怎么可能?

4

2 回答 2

1

没有使用视图键进行子字符串搜索的好方法。您的选择是与 ElasticSearch 集成,或者使用 N1QL,它允许您进行通配符字符串匹配:“SELECT * FROM bucket WHERE type = 'material' and name LIKE '%screw%'”

于 2015-07-09T14:10:04.617 回答
0

我刚刚看到查询中的缺陷:参数必须用小写字母编写,否则 Couchbase 无法识别并忽略它们(如果我在此处收到错误消息而不是通常的结果列表,那将非常有帮助......)。所以相反,我必须查询

startKey=["box","pag"]&endKey=["box\u02ad","pag\u02ad"]

到目前为止,我还没有确切地发现如何管理子字符串搜索。由于paglxpag上述查询的子字符串不会返回任何结果。有什么想法没关系?

于 2015-07-09T08:18:18.727 回答