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"
}

ここで、タイプと名前または番号でクエリできるようにしたいと考えています。特定のクエリ タイプに対して、それぞれのタイプ プロパティを持つドキュメントのみが返されます。さらに、2 番目のクエリ文字列は、検索する資料の種類を指定します。マテリアルの ID または名前に検索用語が含まれている(開始されていない) 場合、それが含まれます。ボックス内の材料の 1 つが用語に一致する場合は、ボックス全体が含まれるものとします。

私が思いついたのは次のとおりです。

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

0

クエリに欠陥がありました。パラメータは小文字で記述する必要があります。そうしないと、Couchbase によって認識されず、無視されます (通常の結果リストではなく、ここでエラー メッセージが表示されると非常に役立ちます...)。代わりに、クエリを実行する必要があります

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

これまで正確にわかっていなかったのは、部分文字列検索の管理方法です。pag上記のクエリの部分文字列であるためlxpag、結果は返されません。これは問題ではありませんか?

于 2015-07-09T08:18:18.727 に答える