pg_search: как расставить приоритеты по точному совпадению слов?

Проблема: при поиске текстов с несколькими вхождениями слов, похожих на поисковый запрос, они получают более высокий рейтинг, чем тексты с одним точным совпадением.

Пример. Скажем, поисковый запрос "производительность", тогда "производство органических продуктов" получает более высокий рейтинг, чем "производительность труда"< /em> только потому, что он содержит два похожих слова, хотя ни одно точное слово не совпадает.

Вопрос. Как лучше всего расставить приоритеты для записей с точными совпадениями?

Вот мой pg_scope:

  pg_search_scope :search,
                  :against => {
                    :title => 'A',
                    :search_string => 'B'
                  },
                  :using => {
                    :tsearch => {
                      :dictionary => 'english',
                      :any_word => 'true'
                    }
                  }

Спасибо.


person vrepsys    schedule 01.06.2014    source источник
comment
Вы когда-нибудь догадывались об этом?   -  person Kathan    schedule 29.12.2015
comment
@Kathan, я не нашел подходящего решения. В итоге я применил порядок точного соответствия в своем запросе. (q) Но если бы я делал это снова, я бы не использовал pg_search и вместо этого использовал эластичный поиск elastic.co   -  person vrepsys    schedule 30.12.2015
comment
Вы можете проверить fuzzystrmatch и использовать levenshtein для проверки точности postgresql.org/docs/9.1 /fuzzystrmatch.html   -  person Int'l Man Of Coding Mystery    schedule 12.02.2020


Ответы (1)


Если вы можете манипулировать поисковым запросом, просмотрите . рейтинг плотности покрытия (ts_rank_cd() вместо ts_rank()) и его параметр normalization.

SELECT v, ts_rank(to_tsvector('english', v), to_tsquery('english', 'productivity')) rank,
       ts_rank_cd(to_tsvector('english', v), to_tsquery('english', 'productivity')) rankcd,
       ts_rank_cd(to_tsvector('english', v), to_tsquery('english', 'productivity'), 4) rankcd4,
       ts_rank_cd(to_tsvector('english', v), to_tsquery('english', 'productivity'), 6) rankcd6
FROM (
  VALUES ('production of organic products'::TEXT),
         ('labour productivity'),
         ('labour productivity with more unrelated words'),
         ('labour productivity with more unrelated words and again production'),
         ('production of productivity'),
         ('product production')
) d(v)

SQLFiddle

Однако я не знаю, как настроить pg_search_scope с пользовательским normalization.

Кроме того, вас может заинтересовать trigram поиск также предлагает более точные (посимвольно) результаты.

person pozs    schedule 27.06.2014