2013-09-12 2 views
1

Как вы возвращаете соответствие для граней, которые начинаются с определенного письма? Например, Elasticsearch предлагает вам использовать запрос "T*", чтобы вернуть все заголовки, начинающиеся с буквы T. Однако это, похоже, возвращает названия, содержащие любые слова, начинающиеся с буквы T. Например, «Деревья и кустарники», а также «Как обрезать деревья». Я только хочу вернуть «Деревья и кустарники». Я пробовал использовать "^T*", но это возвращает SearchPhraseExecutionException.Сопоставьте только первую букву в строке в Elasticsearch

ответ

2

По умолчанию elasticsearch анализирует поля с помощью анализатора в по умолчанию, который делит поле вверх на маркеры расколоть обычно на границах слов на английском языке. Итак, «Как обрезать деревья» разделяется на («Как», «на», «Обрезать», «Деревья»), а токен «Деревья» впоследствии соответствует вашему запросу «T *». Чтобы этого избежать, вы должны указать, что поле not_analyzed в объекте mapping. Это позволяет elasticsearch эффективно обрабатывать значение поля как один гигантский токен, который затем будет корректно соответствовать вашему префиксному запросу.

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

+2

Я использовал много непанелированных полей и столкнулся с проблемами капитализации (например, t! = T). Анализатор ключевых слов + фильтр нижнего регистра также должен позаботиться об этом. – DeH