2016-03-27 4 views
0

Я не получил THIS Например, почему следующие два запроса возвратили 12 в качестве результата? Сообщение объясняет, что способ индексирования данных в _all отличается. Но это не объясняет это. Может кто-то, пожалуйста, помогите мне понять это.Эластичный поиск по индексу _all

GET /_search?q=2014    # 12 results 
GET /_search?q=2014-09-15  # 12 results ! 

ответ

3

Предположим, у вас есть документы, как это: { "name": "John Doe", "occuptation": "Farmer", "favorite_ice_cream": "chocolate" }', { "name": "Jane Doe", "occuptation": "Doctor", "favorite_ice_cream": "vanilla" }'

А также предположить, что любимое поле мороженое не анализировались. Неанализируемые поля очень кашируемые и удобные для выполнения агрегаций (поэтому очень легко подсчитать, сколько людей, например, шоколадное мороженое, например, ваниль). Но не проанализированные поля по умолчанию не доступны для поиска.

Но ... по умолчанию Elasticsearch принимает все поля в документе, заполняет их вместе в поле _all и анализирует их в Lucene. Итак, для первого документа Elastic проанализирует строку «John Doe Farmer chocolate», а для второго поля Elasticsearch проанализирует «Ваниль Джейн Доу Доктор». В результате этого, когда вы отправляете запрос, подобный тому, который вы делали выше, вы можете (например) найти GET /_search?q=chocolate и посмотреть, что Джон Доу любит шоколадное мороженое. Вы также можете отправить запрос строки запроса (https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html), чтобы найти поле _all и по-прежнему выяснить, кто любит шоколад. Однако вы не могли использовать совпадение с любимым полем мороженого ... ведь мы сказали Лучене не анализировать эту область. Однако вы можете использовать фильтр на поле и вернуть все документы, для которых favorite_ice_cream равно шоколаду.

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

Кроме того, если это помогает, мне нравится думать о поле _all, как о том, как выйти из бесплатной карты тюрьмы. Много раз я мог бы не анализировать поле, потому что я хочу использовать на нем агрегаты или применять фильтры. И хотя я обычно помню, какое значение мне нужно для фильтра, иногда полезно иметь возможность отправить поиск в поле _all и убедиться, что ... Так например, если я не могу вспомнить, имеет ли поле «страна» значение « Соединенные Штаты "или" Объединяет Штаты Америки "в качестве значения для США, я могу быстро выполнить запрос к полю _all, посмотреть несколько документов и затем выбрать соответствующее значение фильтра.

Другой способ, которым я использовал поле _all, находится в полнотекстовом поиске, в котором я хочу увеличить совпадения на определенных полях намного выше, но я также хочу искать все поля в документе на случай, если что-то случится с совпадение. В этих обстоятельствах запрос строки запроса в _all отлично работает.

Вы можете узнать больше о поле _all здесь: https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-all-field.html

Надеется, что это достаточно, чтобы вы начали ... вы, вероятно, не хотите, чтобы представить простые запросы так, как вы. Возможно, вы захотите отправить POST-запросы, которые используют полный DSL-запрос. Вы можете узнать больше об этом здесь: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html

Удачи!

+0

Извините, я до сих пор не понял, как результат 12 экземпляров для моего примера. Я принял это как ответ, думая, что он отвечает на мой вопрос, но это не так. – Andy897

+0

То, как вы запрашиваете это (с q =), вы отправляете запрос строки запроса, который является полнотекстовым поисковым запросом. Вероятно, вам не нужен полный текстовый поиск. Потому что то, что вы возвращаете, - это результаты, которые считаются релевантными вашему поиску. Поскольку все документы содержат 2014, они соответствуют запросу строки запроса для 2014-09-15 достаточно хорошо, чтобы считаться релевантным.Но вы не хотите, чтобы результаты были достаточно близкими, чтобы быть релевантными. Вы хотите отфильтровать данные на точное значение. В основном ... разница здесь - релевантность против точных совпадений – evanv

Смежные вопросы