2016-04-29 2 views
-1

поискового вектора Вот проблема:PostgreSQL полнотекстового поиск: Cant получить частичное совпадение

У меня есть таблица в PostgreSQL с адресами в виде простого текста и tsvectors. И я пытаюсь найти запись адреса в таком запросе.

SELECT * FROM address_catalog 
WHERE address_catalog.search_vector @@ to_tsquery('123456:* & Klingon:* & Empire:* & Kronos:* & city:* & Matrok:* & street:* & 789:*') 

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

Я могу искать только страны и города, но если входящая строка содержит улицу, индекс или что-то еще, поиск ничего не возвращает из-за конъюнкции всех векторных токенов. В то же время я просто не могу удалить некоторые строковые части или использовать дизъюнкцию, потому что я никогда не знаю, где в строке есть дополнительные слова.

Итак, есть ли способ построить tsquery, чтобы вернуть несколько лучших совпадений для входящей строки? Или, может быть, частичные матчи? Когда я попытался заставить его использовать ИЛИ вместо И всюду в tsquery, он вернул мне почти всю базу данных. Мне нужно пересечение векторов ... в postgresql.

ответ

1

Я бы рекомендовал использовать расширение smlar (PDF) для этого. Это было написано теми же парнями, которые писали текстовый поиск. Это позволяет использовать меру TF-IDF подобия, что позволяет «посторонними» терминов запроса

Вот как скомпилировать его (я не понял, как скомпилировать его на Windows):

http://blog.databasepatterns.com/2014/07/postgresql-install-smlar-extension.html

И вот как его использовать:

http://blog.databasepatterns.com/2014/08/tf-idf-text-search-in-postgres.html

Смежные вопросы