问题是,根据显示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
解决方法
如果您按顺序订购结果
(addresses.full_string <-> '1493 cambridge')
……你得到了你所要求的.<->
being the trigram “distance” operator.
您可能还想在WHERE子句中使用%(“similarity”)运算符.理想情况下,您将在列上使用带有gist_trgm_ops的GiST索引.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。