У меня есть сценарий, в котором у меня есть данные для неформального общения, которые мне нужно искать. Поэтому я хочу полнотекстовый поиск, но я также понимаю орфографические ошибки. Вопрос в том, как принять во внимание орфографические ошибки, чтобы иметь возможность выполнять нечеткий полнотекстовый поиск ??
Это очень кратко , обсуждаемое в 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
Я не уверен, где я иду не так - может ли кто-нибудь пролить свет? Я чувствую, что я очень близок к тому, чтобы все началось ...?