2016-09-19 4 views
0

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

["Test","Cat","Dog"] 

в категории мест.

У меня есть следующее отображение:

"categories": { 
    "type": "string" 
} 

Несколько образцов документов являются

"categories": [ 
    "Test", 
    "Cat" 
] 

Или

"categories": [ 
    "Blue Cat", 
    "Ball" 
] 

я смог вытащить его с помощью следующего запроса:

query: { 
    match: { 
     categories: { 
      query: ["Test","Cat","Dog"] 
     } 
    } 

Но это вернет мне обе документы, потому что они оба включают в себя «Cat», даже если один из них включает его в виде «Blue Cat», как я могу указать, что я хочу, чтобы точное значение «Cat» не было включает его?

Я читал об изменении типа поля при сопоставлении с вложенным, но массив не принимается как вложенный объект, так как он не имеет ключей и значений.

Если я использую это отображение:

"categories": { 
    "type": "nested" 
} 

Я получаю эту ошибку:

"object mapping for [categories] tried to parse field [null] as object, but found a concrete value" 

Как можно отфильтровать по категориям поля, используя массив возможных значений и убедившись, что он соответствует по крайней мере, одно из значений точно?

ответ

2

Измените поле «not_analyzed». В настоящее время он использует стандартный «стандартный» анализатор, который разделит «Blue Cat» на два токена «Синий» и «Кошка», и именно поэтому ваш запрос соответствует документу, содержащему «Blue Cat».

Вот отображение

{ 
"categories": { 
    "type":  "string", 
    "index": "not_analyzed" 
}} 

Я индексируется два документа с использованием вышеуказанного отображения.

{ 
_index : "test_index", 
_type : "test", 
_id : "2", 
_score : 1, 
_source : { 
    categories : [ 
     "Blue Cat", 
     "Ball" 
    ] 
}}, { 
_index : "test_index", 
_type : "test", 
_id : "1", 
_score : 1, 
_source : { 
    categories : [ 
     "Test", 
     "Cat"] 
}}]} 

Я искал, используя приведенный ниже шаблон

{ 
"query" : { 
    "constant_score" : { 
     "filter" : { 
      "terms" : { 
       "categories" :["Test","Cat","Dog"] 
      } 
     } 
    } 
}} 

я вернусь только первый документ

{ 
"took" : 9, 
"timed_out" : false, 
"_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
}, 
"hits" : { 
    "total" : 1, 
    "max_score" : 1, 
    "hits" : [{ 
      "_index" : "test_index", 
      "_type" : "test", 
      "_id" : "1", 
      "_score" : 1, 
      "_source" : { 
       "categories" : [ 
        "Test", 
        "Cat" 
       ] 
      } 
     } 
    ] 
}} 
Смежные вопросы