2014-01-18 4 views
18

Я совершенно новый для Elasticsearch, так что вот мой вопрос. Я хочу сделать поисковый запрос с elasticsearch и хочу фильтровать с несколькими терминами.Elasticsearch mult term filter

Если я хочу найти пользователя 'tom', то я хотел бы иметь все совпадения, в которых пользователь 'isActive = 1', 'isPrivate = 0' и 'isOwner = 1'.

Вот мой поисковый запрос

"query":{ 
    "filtered": { 
     "query": { 
      "query_string": { 
       "query":"*tom*", 
       "default_operator": "OR", 
       "fields": ["username"] 
      } 
     }, 
     "filter": { 
      "term": { 
       "isActive": "1", 
       "isPrivate": "0", 
       "isOwner": "1" 
      } 
     } 
    } 
} 

Когда я использую 2 термины, он работает как шарм, но когда я использую 3 условия он не делает.

Спасибо за помощь!

ответ

41

Вы должны использовать bool filter в AND все условия:

"query":{ 
    "filtered": { 
     "query": { 
      "query_string": { 
       "query":"*tom*", 
       "default_operator": "OR", 
       "fields": ["username"] 
      } 
     }, 
     "filter": { 
      "bool" : { 
       "must" : [ 
        {"term" : { "isActive" : "1" } }, 
        {"term" : { "isPrivate" : "0" } }, 
        {"term" : { "isOwner" : "1" } } 
       ] 
      } 
     } 
    } 
} 
+12

Это полностью зависит от недели и незначительной версии elasticsearch вы используете. Фаза Луны также может оказывать влияние. Синтаксис для этого изменился больше, чем Дональд Трамп обидел иммигрантов. –

+0

Интересно, почему существует такая несогласованность между эластичными версиями. –

+0

Большое спасибо, этот ответ действительно помогает мне. –