我有一个events
表,其中每个事件都有一个title
和description
。搜索应同时搜索两列:
标题:Dick(ens)和Jane
说明:每周开会讨论经典书籍!
鉴于上述情况,我希望对book club
的查询进行匹配。
我的索引:
CREATE INDEX evsearch_idx on events using gist((title || ' ' || description) gist_trgm_ops)
我的查询:
SELECT * FROM events WHERE title || ' ' || description ILIKE '%book club%'
我认为问题是我从根本上误解了索引的工作原理,因此它试图将整个字符串book club
匹配为各种三个字母的组合,但是我不确定如何解决这个问题。 / p>
答案 0 :(得分:0)
ILIKE
将始终尝试匹配整个字符串。例如,要匹配ILIKE '%book club%'
,字符串需要包括整个字符串book club
。
如果要使用pg_trm
的相似性匹配潜力,则需要使用为其设计的匹配运算符。取自the doc:
%
如果其参数的相似度大于pg_trgm.similarity_threshold设置的当前相似度阈值,则返回true。<%
如果第一个参数中的三元组和第二个参数中的有序三元组的连续范围之间的相似度大于pg_trgm.word_similarity_threshold参数所设置的当前单词相似度阈值,则返回true。 / li>
注释#1 :通过在索引定义和查询中添加lower(...)
,使其不区分大小写。
注释2::如果title || ' ' || description
或NULL
为NULL,title
将返回description
。如果要防止两个值之一为NULL,请在COALESCE(title, '') || ' ' || COALESCE(description, '')
注释#3 :pg_trgm只能做很多事情。对于非常复杂的查询,您可能需要研究full text search