2017-09-25 1 views
0

私はフィルターにquery_stringを変更したい単純なクエリelasticsearchのフィルタでquery_stringを使用するにはどうすればよいですか?

GET data/_search 
{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "prefix": { 
      "last_name": "test" 
      } 
     }, 
     { 
      "bool": { 
      "should": { 
       "query_string": { 
       "query": "henderson OR Boulder City OR Sloan", 
       "fields": [ 
        "city_*" 
       ] 
       } 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

を持っています。私は

 "filter": { 
     "query_string": { 
       "query": "henderson OR Boulder City OR Sloan", 
       "fields": [ 
        "city_*" 
       ] 
      } 
     } 

のようなものに

 { 
      "bool": { 
      "should": { 
       "query_string": { 
       "query": "henderson OR Boulder City OR Sloan", 
       "fields": [ 
        "city_*" 
       ] 
       } 
      } 
      } 
     } 

を変換し、それがhenderson OR Boulder City OR Sloanこのすべての都市で、すべてこの分野city_*.keyword

任意のアイデアによってフィルタを確認してくださいするかどうかはわかりませんか?

答えて

0

変更

{ 
     "bool": { 
     "should": { 
      "query_string": { 
      "query": "henderson OR Boulder City OR Sloan", 
      "fields": [ 
       "city_*" 
      ] 
      } 
     } 
     } 
    } 

{ 
     "bool": { 
     "filter": { 
      "query_string": { 
      "query": "henderson OR Boulder City OR Sloan", 
      "fields": [ 
       "city_*" 
      ] 
      } 
     } 
     } 
    } 

にこれはあなたの希望の動作を取得していますか?フィルタの下で同じクエリを使用すると、同じ結果が得られるはずですが、スコアリングはクエリによって重み付けされません。

編集 - もう一つの推薦私はなるだろうが、これにクエリを調整することです:

GET data/_search 
{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "prefix": { 
      "last_name": "test" 
      } 
     } 
     ], 
     "filter": [ 
     { 
      "query_string": { 
      "query": "henderson OR Boulder City OR Sloan", 
       "fields": [ 
       "city_*" 
       ] 
      } 
     } 
     ]   
    } 
    } 
} 

編集2 - あなたは離れてQUERY_STRINGを使用してから移動することができるかもしれない、これはあなたの任意の速度の増加を与えるのでしょうか? (もしあなたがそれらを傷つけたくないのであれば、フィルタ内にネストされた "shoulds"を変更することができます)

GET data/_search 
{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "prefix": { 
      "last_name": "test" 
      } 
     } 
     ], 
     "should": [ 
     { 
      "match": { 
      "city_*": "henderson" 
      } 
     }, 
     { 
      "match": { 
      "city_*": "Boulder City" 
      } 
     }, 
     { 
      "match": { 
      "city_*": "Sloan" 
      } 
     } 
     ]   
    } 
    } 
} 
+0

それは私に同じ結果をもたらします。私の考えは 'filter'を使うことでしたクエリを少し速くしますが、それは同じ時間かかると思われます。 – Patrioticcow

+0

フィルタと同様に、あなたが提供した例では、同じ結果を与えるでしょう(と私はほぼ同じ費用になると仮定します)。唯一の違いは、スコアリングされるべきであり、フィルタはされないことです。 – Miek

+0

@Patrioticcowこれは、フィルタとして機能するように既存のクエリを更新するだけではなく、若干異なる質問ですが、いくつかのアプローチがあります。クエリ文字列操作を完全にスワップし、個々の用語を配列として検索することが最善の方法です。 – Miek

関連する問題