Как лучше организовать поиск множества полей в ElasticSearch?

День бьюсь, но не могу сообразить как лучше сделать. :(

У меня имеется запись такого вида:

title: "Открытка для мальчиков"
description: "Дети - цветы жизни..."
exist: "В наличии"
whom: ["Ребенку", "Сыну"]
when: ["23 февраля", "День рождения"]

На все текстовые поля натравлены фильтры:

"filter": ["lowercase","synonym", "russian_morphology", "my_stopwords"] со стандартным токенайзером и русской морфологией

Задача - корректно искать эту запись при следующих запросах:
открытка для сына
открытка для детей
открытка к 23 февраля
открытка детям в наличии

Лучшее что я придумал - массивы whom и when схлопывать в строку meta через запятую (чтобы тоже загнать в синонимы и стоп слова) и делать так:
"query": {
"multi_match": {
"query": "открытка для сына",
"type": "cross_fields",
"operator": "AND",
"fields" : [ "title^50", "description", "meta^20", "keywords^10", "exist^100" ],
"analyzer": "synonym"
}
}

Но если он более-менее ищет "открытка для сына", то "открытка для сына в наличии" он уже не находит.

Как вообще правильно строить такой поиск, или может что-то фундаментально не правильно? Или может вообще все поля в одну строку загнать и искать в одном поле (field)? По интернету долго ползал, но ничего похожего не нашел. Многие такие вещи делают через term, но это только в случае, если при поиске есть возможность указать конкретный параметр поиска. А я хочу свободную форму.

Заранее спасибо за помощь!!!

UPDATE: Уточню, как бы я видел формализованную задачу. Необходимо разбирать исходный запрос на отдельные слова, и с учетом русской морфологии и синонимов сравнивать с каждым из указанных выше полей. При этом если слово ни найдется ни в одном поле - то считаем такой запрос в целом не релевантным записи. А если каждое слово из запроса встретиться хоть где-то, то такая запись должна попасть в выдачу.
  • Вопрос задан
  • 2639 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы