Бэкэнд поиска Wagtail с Postgres - использование unaccent с английской конфигурацией поиска
Я не уверен, является ли это недостатком поисковой системы Wagtail, или я пропустил шаг настройки/конфигурации в этой линии.
Я работаю с парой европейских сайтов, где они работают на английском как общем языке, но в контенте есть много людей и географических названий с расширенными латинскими символами.
На db-сервере я добавил расширение unaccent и создал новый конфиг поиска на основе встроенного english с добавленным unaccent (используя пример из postgres):
CREATE TEXT SEARCH CONFIGURATION english_extended ( COPY = english );
ALTER TEXT SEARCH CONFIGURATION english_extended
ALTER MAPPING FOR hword, hword_part, word
WITH unaccent, english_stem;
И бэкенды:
WAGTAILSEARCH_BACKENDS = {
'default': {
'BACKEND': 'wagtail.search.backends.database',
'SEARCH_CONFIG': 'english_extended',
},
'es': {
'BACKEND': 'wagtail.search.backends.database',
'SEARCH_CONFIG': 'spanish',
},
}
У меня есть заголовок страницы со словом Bodø. Для проверки я попробовал выполнить поиск по умолчанию из командной строки psql:
# select title from wagtailcore_page where to_tsvector(title) @@ to_tsquery('Bodo');
title
-------
(0 rows)
Никаких результатов, как и ожидалось. Затем снова, используя новую конфигурацию поиска:
# select title from wagtailcore_page where to_tsvector('english_extended', title) @@ to_tsquery('Bodo');
title
----------------------------------------------------
The old dock at Kjerringøy, Bodø, Nordland, Norway
(1 row)
Страница теперь найдена, поэтому в новом конфиге обрабатывается unaccent.
Пока все хорошо. К сожалению, в Wagtail, когда я ищу, неакцентирования не происходит, любое слово с акцентированным символом игнорируется:
In [1]: from wagtail.search.backends import get_search_backend
In [2]: s=get_search_backend()
In [3]: s.config
Out[3]: 'english_extended'
In [4]: s.search('bodø', Page.objects.all())
Out[4]: <SearchResults []>
In [5]: s.search('bodo', Page.objects.all())
Out[5]: <SearchResults []>
In [6]: s.search('Bodø', Page.objects.all())
Out[6]: <SearchResults []>
In [7]: s.search('dock', Page.objects.all())
Out[7]: <SearchResults [<Page: The old dock at Kjerringøy, Bodø, Nordland, Norway>]>
Если я использую, например, испанский бэкенд, я могу искать неакцентированные термины без каких-либо настроек:
In [1]: from wagtail.search.backends import get_search_backend
In [2]: s=get_search_backend('en')
In [3]: s.search('jeremy' , Page.objects.all())
Out[3]: <SearchResults []>
In [4]: s.search('Jérémy' , Page.objects.all())
Out[4]: <SearchResults []>
In [5]: s=get_search_backend('es')
In [6]: s.config
Out[6]: 'spanish'
In [7]: s.search('jeremy' , Page.objects.all())
Out[7]: <SearchResults [<Page: Jérémy in the title>]>
Может быть, я пропустил какой-то шаг или не хватает дополнительного свойства в определении бэкенда? Или это ошибка/"недокументированная особенность" поисковой системы Wagtail?
Итак, ответ на это, если не решение, заключается в том, что поиск Wagtail не поддерживает несколько wagtail_backends, использующих один и тот же бэкенд с разными конфигурациями поиска.
Все, что происходит, это то, что индекс перестраивается для каждого встречного, оставляя индекс, построенный с последним в списке. В приведенном выше случае, в индекс попало 'spanish', поэтому не происходило никакого смягчения ударения.
Хорошей новостью является то, что с english_extended в последней строке, unaccenting работает отлично, страница, содержащая Bodø, может быть найдена с помощью bodø или bodo.
Jérémy álphabét Bodø Strandå Hôtel cañon
индексируется как 'alphabet':2B 'bodo':3B 'canon':6B 'hotel':5B 'jeremi':1B 'stranda':4B
We are going walking in the mountains
индексируется как 'go':3B 'mountain':7B 'today':8B 'walk':4B
Таким образом, слова без ударения и с остановкой/остановкой обрабатываются правильно.
Плохая новость заключается в том, что, похоже, нет возможности иметь бэкэнд для (скажем) английского языка и бэкэнд для испанского.