PostgreSQL全文搜索问题(to_tsquery)

时间:2016-09-01 21:37:38

标签: postgresql full-text-search

我在搜索数据库时遇到包含停用词的游戏名称的问题。我一般只寻找完全匹配,我想要的很少"模糊"尽可能点击我的所有搜索,最佳为零。

  

E.g。直接产生误报的内容,包含句子   喜欢; "阿富汗战争" +参考" win *"另一个地方;   或者" Lifeseed赢得战争&#34 ;;或者"赢得接管战争的战争   星系"等等。

这当然不起作用并且出错了:

SELECT id, title, content FROM my_table 
WHERE tsvector_combined@@ to_tsquery('win that war');

我曾希望" phraseto_tsquery" woudl工作,因为它解决了我的一些其他搜索(PostgreSQL 9.6),但由于这个中的停用词它没有:

SELECT id, title, content FROM my_table 
WHERE tsvector_combined@@ phraseto_tsquery('win that war');

我也尝试过使用领带战斗机,< 1> | < - >但通常它会得到误报:

SELECT id, title, content FROM my_table 
WHERE tsvector_combined@@ to_tsquery('win <-> that <-> war');

我可以在这里做任何黑客攻击,以获得所需的结果,只返回匹配的匹配项吗?我想也许我可以删除它作为停止词,不知道我是怎么做的,不知道有多好的解决方案可能也在寻找&#34;魔兽世界&#34;以及具有停用词的类似标题(我通常只想要完全匹配)。

思想?

1 个答案:

答案 0 :(得分:1)

要删除部分或全部停用词,请在PostgreSQL软件目录的share/tsearch_data子目录中创建简化或空的停用词文件。然后,您可以使用

创建一个新的雪球文本搜索词典
CREATE TEXT SEARCH DICTIONARY newdict (
   TEMPLATE = pg_catalog.snowball,
   language = '...',
   stopwords = '...'
);

使用新的停用词文件并基于此创建新的文本搜索配置。这当然会使你的指数更大。

从您引用的示例中,我宁愿选择不同的方法并使用全文搜索来使用索引来减少候选人,并使用第二个条件进一步过滤它们:

SELECT id, title, content FROM my_table 
WHERE tsvector_combined @@ to_tsquery('win that war')
  AND (title LIKE '%win that war%' OR content LIKE '%win that war%');