2017-09-25 250 views
0

我有一个简单的查询如何将query_string与elasticsearch中的过滤器一起使用?

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

我想给query_string变为过滤器。我不知道如何

 { 
      "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_*" 
       ] 
      } 
     } 

,并确保它过滤所有这个城市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离开,这是否给你任何速度增加? (你可能应该更改为“应该”被嵌套在过滤器中,以及如果你想让他们不计分)

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

相关问题