нечеткий поиск в полнотекстовом поиске

Я использую postgresql для полнотекстового поиска и обнаружил, что пользователи не будут получать результаты, если есть орфографические ошибки. Я хочу использовать нечеткий поиск и полнотекстовый поиск вместе. Например, мне не удалось объединить индексы Trigram и полнотекстовый поиск.

Как лучше всего обрабатывать слова с орфографическими ошибками в полнотекстовом поиске Postgres?


person d.k    schedule 02.09.2018    source источник
comment
Почему вы хотите использовать полнотекстовый поиск, если триграммные индексы помогают?   -  person Laurenz Albe    schedule 03.09.2018
comment
У меня есть таблица продуктов, и я хочу выполнить поиск по запросу «персональная ручка». Когда я пишу «prsonel pen» или «persnel pn» .., я хочу найти продукт «персональная ручка».   -  person d.k    schedule 03.09.2018
comment
Вы можете сделать это с помощью триграммного индекса без использования полнотекстового поиска, верно?   -  person Laurenz Albe    schedule 03.09.2018
comment
Да, я могу использовать только индекс триграмм, но если я сделаю это, я просто не смогу найти ручку.   -  person d.k    schedule 03.09.2018
comment
Почему нет? Не могли бы вы объяснить поподробнее?   -  person Laurenz Albe    schedule 03.09.2018
comment
выберите * из продукта, где katadi% 'Pencil' - ›работает, но выберите * из продукта, где katadi% 'pncil' -› не работает выберите * из продукта, где katadi% 'prsnel pen' - ›не работает выберите * из продукта, где katadi % 'pen' - ›не работает выберите * из продукта, где katadi% 'pers' -› не работает   -  person d.k    schedule 03.09.2018
comment
Ниже pg_trgm.similarity_threshold или лучше ищите вот так: SELECT * FROM product ORDER BY katadi <-> ' pen' LIMIT 10.   -  person Laurenz Albe    schedule 03.09.2018
comment
Когда я написал это таким образом, это сработало, не могли бы вы предложить источник, как использовать его в laravel? Спасибо большое   -  person d.k    schedule 03.09.2018
comment
Извините, я ничего не знаю о laravel.   -  person Laurenz Albe    schedule 03.09.2018


Ответы (2)


Я бы посоветовал вам использовать полнотекстовый поиск или сопоставление по триграмме, но не пытайтесь их смешивать.

Исходя из требований, я бы сказал, что сопоставление по триграммному сходству подходит лучше.

Если вы не получите результат с помощью оператора подобия %, у вас есть два варианта:

  1. Понизьте порог подобия pg_trgm.similarity_threshold.

  2. Выполните запрос другим способом, чтобы получить наилучшие совпадения, какими бы далекими они ни были:

    SELECT * FROM product ORDER BY katadi <-> ' pen' LIMIT 10;
    

    Думаю, это было бы лучшим решением.

person Laurenz Albe    schedule 03.09.2018
comment
Могу ли я использовать это для поиска более чем одной таблицы? Например, катади и product_quality в разной таблице - person d.k; 03.09.2018
comment
Вы можете использовать два оператора или UNION, чтобы объединить два запроса в один результат. - person Laurenz Albe; 03.09.2018

Чтобы использовать нечеткий поиск, вам необходимо убедиться, что расширение присутствует.

CREATE EXTENSION IF NOT EXISTS fuzzystrmatch;

Проверьте документацию, но вы применяете поиск вроде;

SELECT levenshtein('GUMBO', 'GAMBOL');

Вы могли бы поместить результат в столбец, чтобы упорядочить его? Вам также следует изучить "regexp_replace", чтобы исправить некоторые из известных вам орфографических ошибок.

person Slumdog    schedule 02.09.2018