将查询的部分与三元组索引匹配

Match parts of a query with trigram index

我有一个 table 的 events,其中每个事件都有一个 titledescription。搜索应该搜索两列:

title: Dick(ens) and Jane
description: Meet weekly to discuss classic books!

鉴于以上情况,我想要一个 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 与各种三字母组合相匹配,但我不确定如何解决这个问题.

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

如果您想使用 pg_trm 的相似匹配潜力,您需要使用它设计的匹配运算符。摘自 the doc:

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

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

旁注 #2:如果 titledescription 为 NULL,title || ' ' || description 将 return NULL .如果要防止 2 个值之一为 NULL,请在 COALESCE(title, '') || ' ' || COALESCE(description, '')

上创建索引

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