Трясогузка: использовать собственный анализатор для запроса ES (синонимы)
Мы пытаемся использовать анализатор, поддерживающий поиск по синонимам, со встроенной поддержкой ES7 в Wagtail. До сих пор мы могли определить анализатор и обновить индекс, но у нас нет никаких успехов в настройке анализатора при выполнении запроса.
Это настройки индекса:
'INDEX_SETTINGS': {
'settings': {
'index': {
"analysis": {
"filter": {
"my_synonym_filter": {
"type": "synonym",
"synonyms": [
"bowtie pasta, farfalle",
]
}
},
"analyzer": {
"my_synonyms": {
"tokenizer": "standard",
"filter": [
"lowercase",
"my_synonym_filter"
]
}
}
},
}
},
}
И это пример полезной нагрузки поиска, которую нам нужно отправить в ES:
{
"query": {
"query_string": {
"query": "farfalle",
"analyzer": "my_synonyms"
}
}
}
Мы видели, что в wagtail / search / queryset.py функция поиска не позволяет передавать собственный анализатор в качестве аргумента.
class SearchableQuerySetMixin:
def search(self, query, fields=None,
operator=None, order_by_relevance=True, partial_match=True, backend='default'):
Есть ли способ сделать это без подкласса всех частей, задействованных в реализации ES? Вариант определения его во время индексации на уровне поля кажется чрезвычайно громоздким ('es_extra': индексирование).
В идеале мы могли бы сделать что-то вроде этого:
page_results = TranslatablePage.objects.live().filter(language_id=1).search(search_query, params={'analyzer': 'my_synonyms'})