【问题标题】:Postgresql trigram text search with pg_search results order使用 pg_search 结果顺序的 Postgresql trigram 文本搜索
【发布时间】:2013-01-02 09:59:18
【问题描述】:

我在 rails 上使用 pg_search gem 实现了三元组搜索。 https://github.com/Casecommons/pg_search

问题在于,根据显示 gem 文档的 trigram 搜索的定义,有时返回结果的顺序似乎不正确:

Trigram 搜索通过计算查询和文本之间匹配的三字母子串(或“trigrams”)的数量来工作。

我的应用程序接收来自用户的字符串输入(“111 Streetname”)并返回与 Address.full_string 值匹配的地址列表,并使用三元组进行近似搜索。

搜索示例列表

三字搜索:“1493 cambrid”

  • 结果:
    • 100 剑桥广场
    • 100 剑桥广场
    • 150 剑桥公园博士
    • 剑桥街 1575 号
    • 剑桥街 1573 号
    • 剑桥街 1493 号

三元组搜索:“1493 cambr”

  • 结果:
    • 剑桥街 1493 号

Trigram 搜索:“1493 cambri”

  • 结果:
    • 剑桥街 1575 号
    • 剑桥街 1573 号
    • 剑桥街 1493 号

三字搜索:“1493 cambridge”

  • 结果:
    • 剑桥街 1493 号
    • 5 剑桥公园博士
    • 7 剑桥公园博士
    • 100 剑桥广场
    • 还有更多

问题

¿为什么“1493 Cambridge St”不总是排在搜索结果的首位? ¿ 我需要更改三元组搜索的查询还是只是算法的工作方式?

查询示例

SELECT "addresses".*, (ts_rank((to_tsvector('simple', coalesce("addresses"."full_string"::text, ''))), (to_tsquery('simple', ''' ' || '1493' || ' ''') && to_tsquery('simple', ''' ' || 'cambridge' || ' ''')), 0)) AS pg_search_rank FROM "addresses" WHERE (((coalesce("addresses"."full_string"::text, '')) % '1493 cambridge')) ORDER BY pg_search_rank DESC, "addresses"."id" ASC

【问题讨论】:

    标签: ruby-on-rails-3 postgresql full-text-search pg-search


    【解决方案1】:

    当您引用trigram search 上的手册时,您实际上是在使用来自text searchts_rank() 函数。

    如果您按

    排序结果
    (addresses.full_string <-> '1493 cambridge')
    

    ...你得到你想要的。
    &lt;-&gt; being the trigram "distance" operator.

    您可能还想在WHERE 子句中使用%(“相似性”)运算符。理想情况下,您应该在此列上有一个带有 gist_trgm_ops 的 GiST 索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-21
      • 1970-01-01
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多