首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有pg_search结果顺序的Postgresql文本搜索

带有pg_search结果顺序的Postgresql文本搜索
EN

Stack Overflow用户
提问于 2013-01-18 16:27:00
回答 1查看 1.7K关注 0票数 4

我在rails上使用pg_search gem实现了一个trigram搜索。search

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

Trigram搜索是通过计算查询和文本之间的三个字母子字符串(或“Trigram”)匹配数来完成的。

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

搜索示例列表

Trigram搜索:“1493Cambrid”

  • 结果:
    • 100剑桥甙Pl
    • 100剑桥甙Pl
    • 150剑桥公园博士
    • 1575年剑桥街
    • 1573剑桥街
    • 1493年剑桥街

Trigram搜索:“1493年cambr"

  • 结果:
    • 1493年剑桥街

Trigram搜索:“1493年cambri"

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

Trigram搜索:“1493年剑桥”

  • 结果:
    • 1493年剑桥街
    • 5剑桥公园博士
    • 7剑桥公园博士
    • 100剑桥甙Pl
    • 还有更多

问题

为什么"1493剑桥街“并不总是排在第一位?是否需要更改trigram搜索的查询,还是算法的工作方式?

查询示例

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-18 20:51:42

在引用有关http://www.postgresql.org/docs/current/interactive/pgtrgm.html的手册时,实际上使用的是来自http://www.postgresql.org/docs/current/interactive/functions-textsearch.htmlts_rank()函数。

如果你按

代码语言:javascript
复制
(addresses.full_string <-> '1493 cambridge')

..。你得到了你想要的。

being the trigram "distance" operator.

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14403206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档