【问题标题】:Postgres fuzzy array intersectionPostgres 模糊数组交集
【发布时间】:2021-05-13 15:53:47
【问题描述】:

我正在使用 Postgresql 13,我的问题很容易通过 @> 运算符解决,如下所示:

select id from documents where keywords @> '{"winter", "report", "2020"}';

表示keywords 数组应该包含所有这些元素。我还在此列上创建了 GIN 索引。

即使我提供像 '{"re", "202", "w"}' 这样的请求,是否有可能实现类似的行为?我听说 ngram 有这样的语义,但数组的“交集”能力对我来说至关重要。

【问题讨论】:

    标签: postgresql fuzzy-search


    【解决方案1】:

    在您的示例中,匹配项都是前缀。这是这里的一般规则吗?如果是这样,您可能会使用全文搜索的匹配功能,而不是三元组。这将需要您重新格式化您的数据,或者至少是您的查询。

    select * from  
       (values (to_tsvector('simple','winter report 2020'))) f(x) 
    where x@@ 're:* & 202:* & w:*'::tsquery;
    

    如果字符串可以包含您想要保留的标点符号,您需要自己努力将它们正确格式化为带引号的 tsvector,而不是让 to_tsvector 处理它。使用“简单”配置可以摆脱词干和停用词删除功能,这会干扰您想要做的事情。

    【讨论】:

    • 感谢您的回答,应该可以解决问题,该列的索引应该如何设置?不仅能够匹配前缀会更好,但如果其他解决方案对于不了解 PSQL 服务器编程知识的人来说过于复杂,也可以;
    • @fevgenym 你能重做表格以使“关键字”成为 tsvector 列,还是必须保留 text[] 列?
    猜你喜欢
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2013-08-25
    • 1970-01-01
    • 2017-02-04
    相关资源
    最近更新 更多