postgresql - 将查询的部分内容与 trigram 索引匹配
问题描述
我有一个表格,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
与各种三字母组合匹配,但我不确定如何解决这个问题。
解决方案
ILIKE
将始终尝试匹配整个字符串。例如,要匹配ILIKE '%book club%'
,字符串需要包含整个字符串book club
。
如果要使用 的相似性匹配潜力pg_trm
,则需要使用为其设计的匹配运算符。取自文档:
%
如果其参数的相似度大于 pg_trgm.similarity_threshold 设置的当前相似度阈值,则返回 true。<%
如果第一个参数中的三元组与第二个参数中有序三元组的连续范围之间的相似度大于 pg_trgm.word_similarity_threshold 参数设置的当前单词相似度阈值,则返回 true。
旁注#1lower(...)
:通过添加索引定义和查询使其不区分大小写。
旁注#2:如果或为NULL,title || ' ' || description
将返回。如果要防止 2 个值之一为 NULL,请在NULL
title
description
COALESCE(title, '') || ' ' || COALESCE(description, '')
旁注#3:pg_trgm 只能做这么多。对于非常复杂的查询,您可能需要查看全文搜索
推荐阅读
- html - 将值更新到 firebase
- c - 从共享对象文件 (.so) 中获取函数返回类型和参数
- html - 如何在 Laravel 中捕获显示的图像 ID
- vba - 宏 Internet 处理
- jquery - 将 .animate() 与 if/else 语句切换一起使用?
- c# - 带有 SetCustomAnimations 的片段事务在按下时崩溃:指定的孩子已经有一个父母
- javascript - 如何在 Cocos creator Java 脚本中使用 text to Speech 功能 - Android/IOS APP
- sql-server - 每个父记录的子记录重新编号
- sql - GROUP BY 中前一行的值作为列
- sql-server - “使用'BCP(批量复制程序)/批量插入'我们可以将数据从一个服务器1数据库发送到另一个服务器2数据库......吗?”