2013-04-21 76 views
3

我正在關注this Railscasts插曲。將前綴匹配添加到pg_search

如果我搜索「Kerber」,它會返回正確的文章。 但是,如果我搜索「Ke」它不會返回相同的文章。

有辦法解決這個問題嗎?

class Item < ActiveRecord::Base 
    include PgSearch 
    pg_search_scope :search, against: [:description, :about, :link, :twitterhandle, :builtby], 
    using: {tsearch: {dictionary: "english"}} 

    def self.text_search(query) 
    if query.present? 
     search(query) 
    else 
     scoped 
    end 
    end 

回答

7

我是pg_search的作者和維護者。

您可以將prefix: true添加到:tsearch搜索功能的配置中,讓pg_search自動將:*添加到您的查詢結尾。

https://github.com/Casecommons/pg_search#prefix-postgresql-84-and-newer-only

class Item < ActiveRecord::Base 
    include PgSearch 
    pg_search_scope :search, against: [:description, :about, :link, :twitterhandle, :builtby], 
    using: {tsearch: {prefix: true, dictionary: "english"}} 

    def self.text_search(query) 
    if query.present? 
     search(query) 
    else 
     scoped 
    end 
    end 
end 
+1

方便,謝謝你的跟進。那麼多關於如此多不同工具包,語言等的[tag:postgresql]問題......無法全面瞭解它們的細節。 – 2013-04-23 23:34:07

3

這個結果對我很有意義。 KeKerber是不同的詞,因此它們在全文搜索中不匹配。

僅限於全文搜索詞幹 - 刪除複數等 - 以使cats匹配cat。即使這並不聰明 - dice等非典型複數不會被處理。它也適用於在目標語言詞典中識別的單詞,因此即使KerberKe的複數,當語言設置爲english時也不會被阻止。

見tsquery和tsvectors:

regress=> SELECT to_tsvector('Kerber'), to_tsquery('Kerber'), to_tsvector('ke'), to_tsquery('ke'); 
to_tsvector | to_tsquery | to_tsvector | to_tsquery 
-------------+------------+-------------+------------ 
'kerber':1 | 'kerber' | 'ke':1  | 'ke' 
(1 row) 

和比賽:

regress=> SELECT to_tsvector('Kerber') @@ to_tsquery('Kerber'), to_tsvector('kerber') @@ to_tsquery('ke'); 
?column? | ?column? 
----------+---------- 
t  | f                                         
(1 row)   

我懷疑你想要一個tsearch prefix match。這種表達有:*通配符:

regress=> SELECT to_tsvector('kerber') @@ to_tsquery('ke:*'); 
?column? 
---------- 
t 
(1 row) 

作品前綴匹配。它可能會對搜索效率產生影響,但我認爲它不是主要的。

+0

這正是我的意思。將前綴匹配添加到Items模型解決了我的問題。非常感謝你! – Sullivan 2013-04-22 06:59:27