【发布时间】: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