2013-03-06 84 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创建一个不包含停用词过滤器的自定义分析器。