用Trigram索引匹配查询的各个部分

时间:2018-09-08 06:30:10

标签: postgresql search trigram textmatching

我有一个events表,其中每个事件都有一个titledescription。搜索应同时搜索两列:

  

标题: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>

1 个答案:

答案 0 :(得分:0)

ILIKE将始终尝试匹配整个字符串。例如,要匹配ILIKE '%book club%',字符串需要包括整个字符串book club

如果要使用pg_trm的相似性匹配潜力,则需要使用为其设计的匹配运算符。取自the doc

  1. %如果其参数的相似度大于pg_trgm.similarity_threshold设置的当前相似度阈值,则返回true。
  2. <%如果第一个参数中的三元组和第二个参数中的有序三元组的连续范围之间的相似度大于pg_trgm.word_similarity_threshold参数所设置的当前单词相似度阈值,则返回true。 / li>

注释#1 :通过在索引定义和查询中添加lower(...),使其不区分大小写。

注释2::如果title || ' ' || descriptionNULL为NULL,title将返回description。如果要防止两个值之一为NULL,请在COALESCE(title, '') || ' ' || COALESCE(description, '')

上创建索引

注释#3 :pg_trgm只能做很多事情。对于非常复杂的查询,您可能需要研究full text search