2016-02-14 3 views
1

Я заинтересован в использовании postgres как поисковой системы для веб-сайта, который я разрабатываю, но кажется, что postgres очень строг при сопоставлении типов ts_query и ts_vector. Если ts_vector не содержит всех элементов в запросе, совпадение отклоняется.Совпадение только некоторых слов в полнотекстовом поиске Postgres

Например, я бы ожидал, что запрос «Код переполнения стека» будет соответствовать сводке узлов стека, но это не потому, что слово «код» отсутствует, хотя «Stack» и «Overflow» являются ,

SELECT 
to_tsvector('Stack Overflow is a question and answer site for professional and enthusiast programmers. It''s built and run by you as part of the Stack Exchange network of Q&A sites. With your help, we''re working together to build a library of detailed answers to every question about programming.') 
@@ 
plainto_tsquery('english', 'Stack Overflow code') 

Возвращает:

false 

В моем случае использования, я не заинтересован в точных совпадений, так как это будет использоваться пользователями для поиска веб-сайт.

Есть ли способ подсчитать что-то в качестве соответствия, когда только часть запроса находится в документе?

+0

смотри также smlar расширение, написанное одними и теми же авторами, как поиск текста –

ответ

3

Это потому, что plainto_tsquery отбивает строку в отдельные лексемы и помещает между ними & (AND). Это означает, что он соответствует всем словам.

Если вы хотите | (OR), вам нужно написать собственный «парсер». Например, вы могли бы заменить все вхождения ' ' с '|'

SELECT 
to_tsvector('Stack Overflow is a question and answer site for professional and enthusiast programmers. It''s built and run by you as part of the Stack Exchange network of Q&A sites. With your help, we''re working together to build a library of detailed answers to every question about programming.') 
@@ 
to_tsquery('english', replace('Stack Overflow Code', ' ' , '|'));