我在搜索数据库时遇到包含停用词的游戏名称的问题。我一般只寻找完全匹配,我想要的很少"模糊"尽可能点击我的所有搜索,最佳为零。
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;以及具有停用词的类似标题(我通常只想要完全匹配)。
思想?
答案 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%');