【问题标题】:Possible to rank partial matches in Postgres full text search?可以在 Postgres 全文搜索中对部分匹配进行排名吗?
【发布时间】:2010-02-21 00:43:29
【问题描述】:

我正在尝试为全文匹配计算ts_rank,其中查询中的某些术语可能不在与之匹配的ts_vector 中。我希望在匹配更多单词的比赛中排名更高。看起来很简单?

因为不是所有的术语都必须匹配,所以我必须| 操作数,才能给出诸如to_tsquery('one|two|three') 之类的查询(如果是&,则都必须匹配)。

问题是,无论匹配多少个单词,排名值似乎都相同。换句话说,它是最大化而不是乘以子句。

select ts_rank('one two three'::tsvector, to_tsquery('one')); 给出0.0607927

select ts_rank('one two three'::tsvector, to_tsquery('one|two|three|four')); 给出 0.0455945 的预期较低值,因为 'four' 不是向量。

但是select ts_rank('one two three'::tsvector, to_tsquery('one|two'));

0.0607927 和同样的

select ts_rank('one two three'::tsvector, to_tsquery('one|two|three'));

0.0607927

如果匹配的词条更多,我希望ts_rank 的结果更高。

可能吗?

为了应对一种可能的反应:我无法将搜索查询的所有可能子序列计算为交集,然后将它们全部合并到一个查询中,因为我将处理大型查询。无论如何,我敢肯定有很多反对意见!

编辑:我知道ts_rank_cd,但它不能解决上述问题。

【问题讨论】:

    标签: postgresql full-text-search


    【解决方案1】:

    使用smlar 扩展名(仅限Linux AFAIK,由为我们带来文本搜索的同一个人编写)。

    它具有计算数组之间的 TFIDF、余弦或重叠相似度的功能。它支持索引,所以速度很快。

    另一种方法是在使用之前对查询进行“拼写检查”,基本上是删除所有不在您的语料库中的查询词。

    【讨论】:

    • 非常感谢。奇怪的是看到我四年前遇到的问题的答案!
    【解决方案2】:

    我得出的结论是把&物品放在一起进行排名。在我的选择查询(我正在使用它进行搜索)中,项目是|ed。这似乎有效。

    【讨论】:

      猜你喜欢
      • 2018-02-27
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多