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
作品で探す。
これはどのように可能ですか?