我在rails上使用pg_search gem实现了一个三元组搜索。https://github.com/Casecommons/pg_search
问题是,有时返回结果的顺序似乎不正确,根据gem文档中显示的三元组搜索的定义:
三元组搜索通过计算查询和文本之间匹配的三个字母的子字符串(或"三元组")的个数来工作。
我的应用程序接收来自用户的字符串输入("111 Streetname"),并返回与Address匹配的地址列表。Full_string值与近似搜索与三元组。
搜索示例列表
三元组搜索:"1493 cambrid"
- 结果:
- 100 Cambridgeside Pl
- 100 Cambridgeside Pl
- 150 Cambridgepark Dr 剑桥街1575号
剑桥街1573号剑桥街1493号
三元组搜索:"1493 cambr"
- 结果:
- 剑桥街1493号
卦搜索:"1493 cambri"
- 结果:
- 剑桥街1575号
剑桥街1573号剑桥街1493号
三元组搜索:"1493 cambridge"
- 结果:
- 剑桥街1493号
- 5 Cambridgepark Dr
- 7 Cambridgepark Dr
- 100 Cambridgeside Pl
- 和更多
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
标题>标题>
当您引用三元组搜索的手册时,您实际上是在操作文本搜索的ts_rank()
函数。
如果按
排序(addresses.full_string <-> '1493 cambridge')
…你想要什么就会得到什么。<->
为三元"距离"运算符。
您可能还想在WHERE
子句中使用%
("相似性")操作符。理想情况下,您应该在列上有一个gist_trgm_ops
的GiST索引。