这是我第一次在postgresql中使用全文搜索,我遇到了一个奇怪的问题。 Rails 4(我不认为 Rails 是我问题的一部分)构建如下 sql 代码:
SELECT COUNT(*) FROM "bookmarks"
WHERE (to_tsvector(title || ' ' || description)
@@ (to_tsquery('english', 'ruby')))
它对每一个词都很有魅力,但那些有像 ruby/rubies
这样的衍生词如果我搜索 designer
,它会匹配 designer
和 designers
。很好。
我希望 ruby
匹配 ruby
和 rubies
。目前它不匹配任何东西,甚至 ruby
也不匹配。我错过了什么?
最佳答案
如果您需要将english
指定为to_tsquery
的文本配置,您也需要为to_tsvector
指定它以获得一致的结果。
尝试
SELECT COUNT(*) FROM "bookmarks"
WHERE (to_tsvector('english', title || ' ' || description)
@@ (to_tsquery('english', 'ruby')))
当 english
是默认的文本搜索配置时,to_tsvector('ruby')
将扩展为 'rubi':1
匹配 to_tsquery('english', 'ruby')
但如果文本搜索配置设置为其他内容,它将以不同方式展开并且不会匹配。
例子:
set default_text_search_config='english';
select to_tsvector('ruby') @@ to_tsquery('english','rubies') as result;
result
--------
t
(1 row)
set default_text_search_config='french';
select to_tsvector('ruby') @@ to_tsquery('english','rubies') as result;
result
--------
f
(1 row)
关于当查询有派生词时,postgresql 全文搜索找不到任何东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17125356/