2015-08-10 12 views
1

У меня есть документы, которые выглядят как:Elasticsearch свойство массив должен содержать данный элементы массива

{ 
    "tags" => [ 
     "tag1", 
     "tag2", 
    ], 
    "name" => "Example 1" 
} 

{ 
    "tags" => [ 
     "tag1", 
     "tag3", 
     "tag4" 
    ], 
    "name" => "Example 2" 
} 

Что теперь я хочу, чтобы сделать поиск терминов, где данный массив может выглядеть следующим образом:

[tag1, tag3] 

где ожидается, попадание должно быть:

{ 
    "tags" => [ 
     "tag1", 
     "tag3", 
     "tag4" 
    ], 
    "name" => "Example 2" 
} 

Однако, когда я делаю запрос типа:

GET _search 
{ 
    "query": { 
     "filtered": { 
      "query": { 
       "match_all": {} 
      }, 
      "filter": { 
       "bool": { 
        "must": [ 
         { 
          "terms": { 
          "tags": [ 
           "tag1", 
           "tag3" 
          ] 
          } 
         } 
        ] 
       } 
      } 
     } 
    } 
} 

Я получаю как «пример 1», так и «пример 2» как удары, так как оба примера 1 и пример 2 содержат либо tag1, либо tag3. Посмотрев документацию на термины, я понял, что на самом деле термины содержат запрос.

Как я могу в этом случае убедиться, что пример 2 является единственным ударом при запросе с tag1 и tag3?

+0

Вы должны с минимальным уровнем избыточности отдельных 2-х элементов, или документами с этим точным массивом? – Slam

ответ

2

Вы должны установить execution mode к «и» путем добавления "execution": "and" к terms фильтр так, чтобы все условия должны содержаться в документе, который будет рассмотрен спичку

GET _search 
{ 
    "query": { 
     "filtered": { 
     "query": { 
      "match_all": {} 
     }, 
     "filter": { 
      "terms": { 
       "tags": [ 
        "tag1", 
        "tag3" 
       ], 
       "execution": "and" 
      } 
     } 
     } 
    } 
} 

Это эффективно так же, как создание фильтра bool must с объединением всех условий, но в более компактной форме.

+0

Это сделало трюк :) – Ekenstein

0

Вы можете установить minimum_should_match, чтобы соответствовать вашему массиву:

{ 
    "query": { 
     "filtered": { 
      "query": { 
       "match_all": {} 
      }, 
      "filter": { 
       "bool": { 
        "must": [ 
         { 
          "terms": { 
          "tags": ["tag1","tag3"], 
          "minimum_should_match": 2 
          } 
         } 
        ] 
       } 
      } 
     } 
    } 
} 
Смежные вопросы