Django поиск ранга в Postgres не соответствует - PullRequest
0 голосов
/ 09 мая 2020

У меня есть учебная модель с именем 'building'.

Вот поиск.

tutorial_search = Tutorial.objects.annotate(
    rank=SearchRank(SearchVector('name'), query)
).filter(rank__gte=0.0001).order_by('-rank')

Этот запрос находит мою модель

query = 'bui:*'

Но эта не

query = 'buildi:*'

Я не могу понять, что его вызывает. Это английский sh акцент? Похоже на простой поиск.

EDIT:

Я пробовал чистые SQL запросы в postgres и получил тот же результат. Это работает:

SELECT to_tsvector('building') @@ to_tsquery('(build:*)');

Возвращает True

Но этот:

SELECT to_tsvector('building') @@ to_tsquery('(buildi:*)');

Возвращает False

Почему?

Спасибо !

1 Ответ

0 голосов
/ 12 мая 2020

Если я понял, вы спрашивали о мотивах поведения ваших запросов.

Вы можете протестировать лексемы, сгенерированные из ваших слов, в ваших запросах, как показано ниже:

SELECT ts_lexize('english_stem', 'building');
 ts_lexize 
-----------
 {build}

SELECT ts_lexize('english_stem', 'build');
 ts_lexize 
-----------
 {build}

SELECT ts_lexize('english_stem', 'buildi');
 ts_lexize 
-----------
 {buildi}

Как вы можно увидеть, что лексемы, сгенерированные с помощью 'build' и 'build', одинаковы ('build'), а 'buildi' генерирует другой 'buildi'.

Это потому, что первые два работают, а третий - нет. .

Дополнительные сведения см. В документации Тестирование и отладка текстового поиска .

...