4

我在 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 号

卦搜索:“1493 cambri”

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

卦搜索:“1493 剑桥”

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

问题

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

查询示例

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
4

1 回答 1

3

当您引用有关trigram 搜索的手册时,您实际上是在使用文本搜索ts_rank()中的功能进行操作。

如果您按以下顺序排列结果

(addresses.full_string <-> '1493 cambridge')

...你得到你想要的。
<->是三元组“距离”运算符。

您可能还想在子句中使用%("similarity") 运算符。理想情况下,您应该在列上WHERE有一个 GiST 索引。gist_trgm_ops

于 2013-01-18T20:51:42.350 回答