2016-07-05 5 views
1

現在、私はここに文書がどのように見えるかの例です、タグの配列インデックス内の各文書を与えているelasticsearchを使用してタグの検索アプリケーションを開発する:Elasticsearch一致与えられた配列内のすべてのタグ

_source: { 
    title: "Keep in touch scheme", 
    intro: "<p>hello this is a test</p> ", 
    full: " <p>again this is a test mate</p>", 
    media: "", 
    link: "/training/keep-in-touch", 
    tags: [ 
    "employee", 
    "training" 
    ] 
} 

私は希望を検索を行い、指定されたすべてのタグを含むドキュメントのみを返すようにします。

上記の例を使用して、タグ["employee", "training"]を持つドキュメントを検索すると、上記の結果が返されます。

対照的に、タグ["employee", "other"]で検索した場合、何も返されません。検索クエリ内のすべてのタグが一致する必要があります。しかし、これが一致しているようだ、私はまた、配列を連結し、カンマで区切られた文字列を使用してみましたが

query: { 
    bool: { 
    must: [ 
     { match: { tags: ["employee","training"] }} 
    ] 
    } 
} 

が、私はちょうど

IllegalStateException[Can't get text on a START_ARRAY at 1:128]; 

のように返された例外を取得しています:

現在、私はやっています最初のタグが指定されているものはすべて一致します。

これにアプローチする方法についてのご意見はありますか?乾杯

答えて

1

オプション1:次の例は、(v2.3.2)を動作するはずです:

curl -XPOST 'localhost:9200/yourIndex/yourType/_search?pretty' -d '{ 
    "query": { 
    "bool": { 
     "must": [ 
     { "term": { "tags": "employee" } } , 
     { "term": { "tags": "training" } } 
     ] 
    } 
    } 
}' 

オプション2:また、あなたが試すことができます:

curl -XPOST 'localhost:9200/yourIndex/yourType/_search?pretty' -d '{ 
    "query": { 
    "filtered": { 
     "query": {"match_all": {}}, 
     "filter": { 
     "terms": { 
      "tags": ["employee", "training"] 
     } 
     } 
    } 
    } 
}' 

しかし"minimum_should_match": 1せずに、それは少し作品ビンは正確ではありません。 私も"execution": "and"を見つけましたが、正確ではありません。

オプション3:また、あなたは猫、それは完璧に動作しますが、少し複雑に見えますquery_stringを試してみてください。

curl -XPOST 'localhost:9200/yourIndex/yourType/_search?pretty' -d '{ 
"query" : { 
    "query_string": { 
     "query": "(tags:employee AND tags:training)" 
    } 
    } 
}' 

多分それはあなたのために参考になる...

+0

を照会することができます - 理想的には私は、クエリ –

+0

に様々な長さの配列を渡すことができます@ WilliamPulもう一つの例を追加しましたが、私は '' minimum_should_match ":1'をes v2.3.2で使う方法を見つけることができません... –

+0

@WilliamPaulまた、' query_string'で例を追加しました。 –

0

そのセットを確保するため指定された値のみを含み、タグカウントを追跡するためのセカンダリフィールドを維持します。そして、あなたはこれで問題は、タグの量が異なる可能性があり、それは常に2ではない以下のような目的の結果を得るために

"query":{ 
    "bool":{ 
     "must":[ 
      {"term": {"tags": "employee"}}, 
      {"term": {"tags": "training"}}, 
      {"term": {"tag_count": 2}} 
     ] 
    } 
} 
関連する問題