"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: Уточню, как бы я видел формализованную задачу. Необходимо разбирать исходный запрос на отдельные слова, и с учетом русской морфологии и синонимов сравнивать с каждым из указанных выше полей. При этом если слово ни найдется ни в одном поле - то считаем такой запрос в целом не релевантным записи. А если каждое слово из запроса встретиться хоть где-то, то такая запись должна попасть в выдачу.