Я создал полнотекстовый поиск Postgresql с использованием «german». Как я могу настроить, что, когда я ищу «Bezirk», строки, содержащие «Без». также совпадают? (И наоборот)PostgreSQL полные текстовые сокращения поиска
ответ
@pozs прав. Вам необходимо использовать synonym dictionary.
1 - В директории $ SHAREDIR/tsearch_data создать файл german.syn со следующим содержимым:
Bez Bezirk
2 - Выполнить запрос:
CREATE TEXT SEARCH DICTIONARY german_syn (
template = synonym,
synonyms = german);
CREATE TEXT SEARCH CONFIGURATION german_syn(COPY='simple');
ALTER TEXT SEARCH CONFIGURATION german_syn
ALTER MAPPING FOR asciiword, asciihword, hword_asciipart,
word, hword, hword_part
WITH german_syn, german_stem;
Теперь вы можете проверить его. Execute запросы:
test=# SELECT to_tsvector('german_syn', 'Bezirk') @@ to_tsquery('german_syn', 'Bezirk & Bez');
?column?
----------
t
(1 row)
test=# SELECT to_tsvector('german_syn', 'Bez Bez.') @@ to_tsquery('german_syn', 'Bezirk');
?column?
----------
t
(1 row)
Дополнительные ссылки:
Попробуйте использовать подстановочный знак в своем поиске.
Например:
tableName.column LIKE 'Bez%'
%
будет искать любую букву или цифру после Bez
Дело в том, что «Без». хранится в базе данных, и я запрашиваю для «Bezirk», поэтому запросы - это наоборот, чем вы предполагаете и предлагаете. – JohnDoe
Описание проблемы очень расплывчато и поэтому трудно точно определить, что вы пытаетесь сделать. Извините, я не смог вам помочь. Удачи вам в вашей проблеме. –
Описание очень расплывчато, чтобы понять, что вы пытаетесь достичь, но это выглядит, как вам нужно просто pattern matching поиск, поскольку вы ищете сокращения (так что нужно делать, как в полнотекстовом поиске). Я бы с pg_trgm
для этой цели:
WITH t(word) AS (VALUES
('Bez'),
('Bezi'),
('Bezir')
)
SELECT word, similarity(word, 'Bezirk') AS similarity
FROM t
WHERE word % 'Bezirk'
ORDER BY similarity DESC;
Результат:
word | similarity
-------+------------
Bezir | 0.625
Bezi | 0.5
Bez | 0.375
(3 rows)
Вам нужно создать пользовательский словарь синонимов [] (http://www.postgresql.org/docs/current/ static/textsearch-dictionaries.html # TEXTSEARCH-SYNONYM-DICTIONARY), если вы хотите совместить его с текстовым поиском – pozs
@pozs кажется, что ваше предложение - путь. Когда вы сформулируете это как ответ, я бы принял его. – JohnDoe