首页 > 解决方案 > 将查询的部分内容与 trigram 索引匹配

问题描述

我有一个表格,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与各种三字母组合匹配,但我不确定如何解决这个问题。

标签: postgresqlsearchtrigramtextmatching

解决方案


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

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

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

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

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

旁注#3:pg_trgm 只能做这么多。对于非常复杂的查询,您可能需要查看全文搜索


推荐阅读