2015-02-19 5 views
1

Я только начинаю использовать Elasticsearch, и мне приходится работать с данными, созданными коллегой. Я заметил, что каждый данные Строка полнотекстового значение:Elasticsearch, фильтр по полнотекстовой строке

{ 
    "countryId": { 
     "type": "string" 
} 

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

Итак, мой вопрос в следующем: что произойдет, если я сделаю поиск на основе фильтра по полнотекстовым значениям? Будут ли анализироваться критерии поиска, как если бы вы использовали поиск match, или фильтр игнорирует полнотекстовый тип этого значения и обрабатывает его как точное значение, сохраняя много времени поиска, так как фильтры очень быстрые?

Я просмотрел документацию и вокруг, но не смог получить четкий ответ.

+0

Посредством поиска по полнотекстовым значениям на основе фильтра, вы имеете в виду что-то вроде отфильтрованного запроса с фильтром 'term'? – rchang

+0

Да, я пробовал сегодня, и кажется, что он просто не находит эти значения, просто исключите его. – sam

ответ

2

Возможно, у вас уже есть эмпирическое наблюдение, что происходит, когда вы пытаетесь это сделать, но для того, чтобы фильтр term работал должным образом (в точности соответствует указанному параметру в указанном поле), отображение для индекса должно определять поле index свойство not_analyzed. Официальная документация для termhere фильтра, но самое непосредственное отношение часть может быть таким:

Фильтры документы, которые имеют поля, содержащие термин (не проанализирован).

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

{"mappings" : {"the_document_type": { 
    "countryId" : {"type" : "string", "index" : "not_analyzed"}, 
    ... 
    ... Mappings for other fields in your document 
    ... 
}}} 

Учитывая выше фрагмент кода, запрос, содержащий term фильтра, требующего документы точно соответствовать какому-то параметру, заданному для countryId должно быть успешный. Что-то вроде следующего:

{"query" : {"filtered" : 
    "query" : {"match_all" : {}}, 
    "filter" : {"term" : {"countryId" : "Kingdom of Anvilania"}} 
}} 

Там в дальнейшем документация string типа (и все другие основные типы) в Elasticsearch here, но определенная часть об атрибуте index заключается в следующем:

Набор для проанализирован для того, чтобы поле было проиндексировано и доступно для поиска после разбиения на токен с помощью анализатора. not_analyzed означает, что он все еще доступен для поиска, но не проходит никакого анализа или не разбивается на токены. не означает, что он не будет доступен для поиска вообще (как отдельное поле, он все равно может быть включен в _all). Устанавливать, чтобы не отключать include_in_all. По умолчанию анализируется.

+0

Действительно, упоминание о совпадении на точное значение действительно упоминается, но нет четкого упоминания о том, что происходит при применении фильтра на полное тестовое значение. Но я могу только догадываться, что файл будет всегда отклонять значение. – sam

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