我在rails上使用pg_search gem实现了一个trigram搜索。search
问题是,根据显示gem文档的trigram搜索的定义,返回结果的顺序有时似乎不正确:
Trigram搜索是通过计算查询和文本之间的三个字母子字符串(或“Trigram”)匹配数来完成的。
我的应用程序接收来自用户的字符串输入(“111Streetname”),并返回一个地址列表,该列表与Address.full_string值匹配,并使用trigram进行近似搜索。
搜索示例列表
Trigram搜索:“1493Cambrid”
Trigram搜索:“1493年cambr"
Trigram搜索:“1493年cambri"
Trigram搜索:“1493年剑桥”
问题
为什么"1493剑桥街“并不总是排在第一位?是否需要更改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发布于 2013-01-18 20:51:42
在引用有关http://www.postgresql.org/docs/current/interactive/pgtrgm.html的手册时,实际上使用的是来自http://www.postgresql.org/docs/current/interactive/functions-textsearch.html的ts_rank()函数。
如果你按
(addresses.full_string <-> '1493 cambridge')..。你得到了你想要的。
being the trigram "distance" operator.
您还可能希望在%子句中使用WHERE (“相似性”)运算符。理想情况下,您应该在列中有一个GiST索引,其中包含gist_trgm_ops。
https://stackoverflow.com/questions/14403206
复制相似问题