ruby on rails 3 - Postgresql的三重文本搜索与pg_search结果顺序



我在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
  • 和更多
<标题> 为什么"剑桥街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

当您引用三元组搜索的手册时,您实际上是在操作文本搜索ts_rank()函数。

如果按

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

…你想要什么就会得到什么。
<->为三元"距离"运算符。

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

相关内容

  • 没有找到相关文章

最新更新