2013-03-06 116 views
0

如果我有兩個字符串:EdgeNGram用輪胎和ElasticSearch

  • 李四,喬
  • 李四,喬納森

我想實現一個搜索這樣的:

  • 「Doe」>「Doe,Joe」,「Doe,Jonathan」
  • 「Doe J」>「Doe,Joe」,「Doe,Jonathan」
  • 「喬恩·多伊」> 「李四,喬納森」
  • 「喬納待辦事項」> 「李四,喬納森」

下面的代碼,我有:

settings analysis: { 
    filter: { 
     nameNGram: { 
     type: "edgeNGram", 
     min_gram: 1, 
     max_gram: 20, 
     } 
    }, 
    tokenizer: { 
     non_word: { 
     type: "pattern", 
     pattern: "[^\\w]+" 
     } 
    }, 
    analyzer: { 
     name_analyzer: { 
     type: "custom", 
     tokenizer: "non_word", 
     filter: ["lowercase", "nameNGram"] 
     }, 
    } 
    } do 
    mapping do 
    indexes :name, type: "multi_field", fields: { 
     analyzed: { type: "string", index: :analyzed, index_analyzer: "name_analyzer" }, # for indexing 
     unanalyzed: { type: "string", index: :not_analyzed, :include_in_all => false } # for sorting 
    } 
    end 
end 

def self.search(params) 
    tire.search(:page => params[:page], :per_page => 20) do 
    query do 
     string "name.analyzed:" + params[:query], default_operator: "AND" 
    end 
    sort do 
     by "name.unanalyzed", "asc" 
    end 
    end 
end 

不幸的是,這並未看起來工作......標記化看起來很棒,因爲「Doe,Jonathan」我得到了像「d」,「do」,「doe」,「j」,「jo」,「jon」,「jona 「等,但如果我搜索」做和喬「,我什麼都沒有回來。但是,如果我搜索「喬納」,我會回到「多伊,喬納森。」我究竟做錯了什麼?

回答

0

如果您想創建自動完成,您應該只能使用EdgeNGram。我懷疑你想使用模式過濾器來分隔我的逗號。

事情是這樣的:

"tokenizer": { 
    "comma_pattern_token": { 
     "type": "pattern", 
     "pattern": ",", 
     "group": -1 
    } 
} 

如果我錯了,你需要edgeNGrams某些其他原因那麼你的問題是,你的指數分析儀忽略停止詞(如詞AND)和搜索分析儀不是。您需要爲您的search_analyzer創建一個不包含停用詞過濾器的自定義分析器。