Postgres полнотекстовый поиск и орфографические ошибки (иначе нечеткий полнотекстовый поиск) - PullRequest
0 голосов
/ 21 января 2020

У меня есть сценарий, в котором у меня есть данные для неформального общения, которые мне нужно искать. Поэтому я хочу полнотекстовый поиск, но я также понимаю орфографические ошибки. Вопрос в том, как принять во внимание орфографические ошибки, чтобы иметь возможность выполнять нечеткий полнотекстовый поиск ??

Это очень кратко , обсуждаемое в Postgres Полнотекстовый поиск Достаточно хорошо , где в статье обсуждается орфография.

Итак, я создал таблицу «документов», создал индексы и т. д. c.

CREATE TABLE data (
  id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
  text TEXT NOT NULL);

Я могу создать дополнительный столбец типа tsvector и index соответственно ...

alter table data 
  add column search_index tsvector 
  generated always as (to_tsvector('english', coalesce(text, ''))) 
  STORED;

create index search_index_idx on data using gin (search_index);

У меня есть, например, некоторый текст, в котором данные говорят "baloon", но кто-то может искать "balloon", поэтому я вставляю две строки (одна намеренно написано с ошибкой) ...

insert into data (text) values ('baloon');
insert into data (text) values ('balloon');

select * from data;

id |  text   | search_index
----+---------+--------------
 1 | baloon  | 'baloon':1
 2 | balloon | 'balloon':1

... и выполнить полнотекстовый поиск по данным ...

select * from data where search_index @@ plainto_tsquery('balloon');

 id |  text   | search_index
----+---------+--------------
  2 | balloon | 'balloon':1
(1 row)

Но я не вернул результаты для версии с ошибкой " baloon "... Таким образом, используя предложение в связанной статье, я построил таблицу поиска всех слов в моем лексиконе следующим образом ...

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

CREATE TABLE data_words AS SELECT word FROM ts_stat('SELECT to_tsvector(''simple'', text) FROM data');

CREATE INDEX data_words_idx ON data_words USING GIN (word gin_trgm_ops);

. ... и я могу искать похожие слова, которые могли быть написаны с ошибками

выберите слово, сходство (слово, «воздушный шар») как сходство с data_words, где сходство (слово, «воздушный шар»)> 0,4 ​​порядка по сходству ( word, 'balloon');

  word   | similarity
---------+------------
 baloon  |  0.6666667
 balloon |          1

... но как на самом деле включить слова с ошибками в мой запрос?

Разве это не то, что означает приведенная выше статья?

select plainto_tsquery('balloon' || ' ' || (select string_agg(word, ' ') from data_words where similarity(word, 'balloon') > 0.4));

         plainto_tsquery
----------------------------------
 'balloon' & 'baloon' & 'balloon'
(1 row)

... подключен к реальному поиску, и я не получаю строк!

select * from data where text @@ plainto_tsquery('balloon' || ' ' || (select string_agg(word, ' ') from data_words where similarity(word, 'balloon') > 0.4));

select * from data where search_index @@ phraseto_tsquery('baloon balloon'); -- no rows returned

Я не уверен, где я иду не так - может ли кто-нибудь пролить свет? Я чувствую, что я очень близок к тому, чтобы все началось ...?

1 Ответ

0 голосов
/ 21 января 2020
SELECT to_tsquery('balloon |' ||
                  string_agg(word, ' | ')
       )
FROM data_words
WHERE similarity(word, 'balloon') > 0.4;
...