使用pg_search结果顺序进行Postgresql trigram文本搜索

时间:2013-01-18 16:27:00

标签: ruby-on-rails-3 postgresql full-text-search pg-search

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

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

  

Trigram搜索的工作原理是计算查询和文本之间有多少三个字母的子串(或“三字母”)匹配。

我的应用程序从用户接收字符串输入(“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 Cambridgepark Dr
    • 7 Cambridgepark Dr
    • 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

1 个答案:

答案 0 :(得分:3)

当您在trigram search上引用手册时,实际上您正在使用text search中的ts_rank()功能。

如果您按

订购结果
(addresses.full_string <-> '1493 cambridge')

...你得到了你所要求的。
<-> being the trigram "distance" operator.

您可能还想在%子句中使用WHERE(&#34;相似性&#34;)运算符。理想情况下,您可以在列上使用gist_trgm_ops的GiST索引。