2016-03-04 3 views
0

Я создал полнотекстовый поиск Postgresql с использованием «german». Как я могу настроить, что, когда я ищу «Bezirk», строки, содержащие «Без». также совпадают? (И наоборот)PostgreSQL полные текстовые сокращения поиска

+1

Вам нужно создать пользовательский словарь синонимов [] (http://www.postgresql.org/docs/current/ static/textsearch-dictionaries.html # TEXTSEARCH-SYNONYM-DICTIONARY), если вы хотите совместить его с текстовым поиском – pozs

+0

@pozs кажется, что ваше предложение - путь. Когда вы сформулируете это как ответ, я бы принял его. – JohnDoe

ответ

1

@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) 

Дополнительные ссылки:

  1. PostgreSQL: A Full Text Search engine
0

Попробуйте использовать подстановочный знак в своем поиске.

Например:

tableName.column LIKE 'Bez%' 

% будет искать любую букву или цифру после Bez

+0

Дело в том, что «Без». хранится в базе данных, и я запрашиваю для «Bezirk», поэтому запросы - это наоборот, чем вы предполагаете и предлагаете. – JohnDoe

+0

Описание проблемы очень расплывчато и поэтому трудно точно определить, что вы пытаетесь сделать. Извините, я не смог вам помочь. Удачи вам в вашей проблеме. –

0

Описание очень расплывчато, чтобы понять, что вы пытаетесь достичь, но это выглядит, как вам нужно просто 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)