2017-04-04 10 views
0

私は 'must'と 'must_not'機能のboolクエリを使用しています。私は3レベルの深さのプロパティになるまで期待どおりに動作します。例えば弾性検索| Boolクエリ

GET city/town/_search 
{ 
    "query": { 
     "match": { 
      "contact.residence.address": "Rocky Road" 
     } 
    } 

} 

作品だけで罰金とのような簡単な試合クエリが...結果を返しますが、私は..ブールクエリのように

GET city/town/_search 
{ 
    "query": { 
     "bool": { 
     "must": [ 
      { 
       "term": { 
        "contact.residence.address": "Rocky Road" 
       } 
      } 
     ] 
     } 
    } 
} 

リターンNO結果を同じことを行う場合。どうしてこれなの?????

GET city/town/_search 
{ 
    "query": { 
     "bool": { 
     "must": [ 
      { 
       "term": { 
        "store.name": "Hendersons" 
       } 
      } 
     ] 
     } 
    } 
} 

などの他のboolクエリを念頭に置いてください。それは3レベルの深さしかないので、prop1.prop3.prop3という用語を検索します。

+0

を使用する必要があります。 'text'型でマップされます。そうであれば、2回目のクエリで 'term'を' match'と置き換えると、期待どおりに動作します。なぜ、用語クエリが私の文書と一致しないのですかというセクションを読むことをお勧めします。公式の文書[here](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html#query-dsl-term-query)にあります。 – avr

答えて

2

なぜなら、最初の検索はmatchのクエリを使用し、もう1つはtermのクエリを使用するからです。違いは、matchクエリは、正しい用語を与える入力にアナライザを適用することです。 termクエリは入力を分析せず、単一の用語として使用します。それは二つの用語に分割されなければならない「ロッキーロード」「ヘンダーソン」などの入力のためではなく、入力のために同じ結果を与えるかもしれないので、あなたは、あなたが `contact.residence.address`フィールドを持っているかもしれませんmatchクエリ

GET city/town/_search 
{ 
    "query": { 
     "bool": { 
     "must": [ 
      { 
       "match": { 
        "contact.residence.address": "Rocky Road" 
       } 
      } 
     ] 
     } 
    } 
} 
+0

チャームのように働いた。ありがとうございました! – emarel