【问题标题】:PostgreSQL exact match with full text searchPostgreSQL 与全文搜索完全匹配
【发布时间】:2020-04-14 15:30:37
【问题描述】:

如何搜索与搜索词组匹配的行?如果搜索查询是funny dog

我需要得到结果,其中搜索字段包含 ONLY 这两个词“有趣”和“狗”以任何顺序、任何词形式(狗、更有趣、最有趣......)和跳过介词和冠词(a, the, and, of...)

【问题讨论】:

  • 只是一个猜测:SELECT headername FROM myDatabase WHERE headername = 'dog' or headername "'gentle'。编辑:似乎通配符符号消失了. 用*测试包裹狗和温柔

标签: sql database postgresql


【解决方案1】:

考虑到 PostgreSQL 使用的英语词干分析器不提取比较级和最高级(我不得不认为这是设计使然,而不仅仅是错误),因此在 PostgreSQL 中没有开箱即用的合理方法。

select to_tsvector('english','funny funnier funniest big bigger biggest');
                            to_tsvector                            
-------------------------------------------------------------------
 'big':4 'bigger':5 'biggest':6 'funni':1 'funnier':2 'funniest':3

但是,如果您安装了english_hunspell dictionary(本身并非微不足道),那么您可以更接近您想要的,至少对于您给出的一个示例。

create text search configuration english_hun (copy = english);
ALTER TEXT SEARCH CONFIGURATION english_hun alter mapping replace english_stem with english_hunspell;
select to_tsvector('english_hun','funny funnier funniest big bigger biggest');
                 to_tsvector                  
----------------------------------------------
 'big':4 'bigger':5 'biggest':6 'funny':1,2,3

最常见的介词已经是停用词,但不是全部,因此您可能需要调整停用词列表。

在进行通常的匹配 (@@) 之后,您可以添加一个 AND 条件以确保 tsvector 和 tsquery 的长度相同。这将匹配“有趣的狗有趣”,我不清楚你是否愿意。

【讨论】:

  • 谢谢。是否有任何选项可以使 tsquery 与 tsvector 完全匹配?不是部分的,因为它与 @@ 运算符一起使用。类似比较 tsquery 和 rsvector 的相等性,而不是。
  • 我不这么认为。 'strip' 将从 tsvector 中删除位置指示符,但也会删除每个标记出现次数的任何指示。所以我认为如果你不想让“有趣的狗有趣”匹配,你需要自己实现一些东西。在 plpython 或 plperl 中应该不那么难,只是让所有的引用和转义都正确有点乏味。
  • 这真是个无赖。他们有什么理由这样做?我希望能够使用 PG 而不是 ElasticSearch,至少在一段时间内
  • 它没有明确存储计数。如果列出了 7 个位置,则意味着它出现了 7 次。如果删除位置,则会隐式删除计数。因此,删除计数不是故意的。出于好奇,你如何让 elasticsearch 做你想做的事?
  • @jjanes 我现在正在玩 ElasticSearch,实际上它似乎也不起作用。看来我要重试 Postgres。
猜你喜欢
  • 2022-08-11
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 2020-04-18
  • 2018-07-21
相关资源
最近更新 更多