ruby-on-rails-3 – 使用pg_search结果顺序进行Postgresql trigram文本搜索

我在rails上使用pg_search gem实现了一个trigram搜索. https://github.com/Casecommons/pg_search

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

Trigram search works by counting how many three-letter substrings (or “trigrams”) match between the query and the text.

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

搜索示例列表

Trigram搜索:“1493 cambrid”

>结果:

> 100 Cambridgeside Pl
> 100 Cambridgeside Pl
> 150 Cambridgepark Dr
> 1575 Cambridge St
> 1573 Cambridge St.
> 1493 Cambridge St.

Trigram搜索:“1493 cambr”

>结果:

> 1493 Cambridge St.

Trigram搜索:“1493 cambri”

>结果:

> 1575 Cambridge St
> 1573 Cambridge St.
> 1493 Cambridge St.

Trigram搜索:“1493 cambridge”

>结果:

> 1493 Cambridge St.
> 5剑桥公园博士
> 7剑桥公园博士
> 100 Cambridgeside Pl
>还有更多

¿为什么不是“1493 Cambridge St”总是在结果之上? ¿我是否需要更改trigram搜索查询,还是仅仅是算法的工作方式?

查询示例

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

解决方法

当您在 trigram search上引用手册时,实际上您正在使用 text search中的ts_rank()函数.

如果您按顺序订购结果

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

……你得到了你所要求的.
<-> being the trigram “distance” operator.

您可能还想在WHERE子句中使用%(“similarity”)运算符.理想情况下,您将在列上使用带有gist_trgm_ops的GiST索引.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...