2013-01-15 62 views
7

我们正在运行ElasticSearch,并且在搜索包含空格的术语时遇到一些问题。一个具体的例子:有一个叫JM Bruno的人,但是当搜索这个时,没有结果被返回。我隐约记得搜索这个确切的术语确实会返回结果,但我现在无法再现。ElasticSearch空间术语

我试着给我的标记模式添加一个空格以及“\”,但没有多少运气。在ES设置如下(使用轮胎的宝石在Ruby on Rails应用程序)

module Search 
def self.included base 
base.send :include, Tire::Model::Search 
base.send :include, Tire::Model::Callbacks 

base.class_eval do 
    settings analysis: { 
       filter: { 
       ngram: { 
        type: 'nGram', 
        max_gram: 12, 
        min_gram: 3 
       }, 
       url_stop: { 
        type: "stop", 
        stopwords: %w[http https] 
       } 
       }, 
       tokenizer: { 
       url_email_tokenizer: { 
        pattern: '[^\w\-\[email protected]]+', 
        type: 'pattern' 
       } 
       }, 
       analyzer: { 
       url_analyzer: { 
        tokenizer: "url_email_tokenizer", 
        filter: %w[url_stop ngram], 
        type: "custom" 
       }, 
       name_analyzer: { 
        tokenizer: 'url_email_tokenizer', 
        filter: 'ngram', 
        type: 'custom' 
       } 
       } 
      } 


    end 
    end 
end 

我们使用这些断词搜索域名和电子邮件地址,以及。

回答

3

尝试运行_analyze API与您应用到您的字段的分析器。

curl -XGET 'localhost:9200/_analyze?analyzer=name_analyzer' -d 'JM Bruno' 

您将看到Elasticsearch如何将您的字段内容分解为令牌以及为什么您无法使用TermQuery进行搜索。没有分析TermQuery,因此它将您的查询与倒排索引完全相比较。

+0

它返回一个400码与错误“未能找到分析仪”。谈到分析仪时,ES不知道我用于轮胎宝石中的设置? – HannesFostie

+0

尝试MyModel.index.analyze“我的文本”,分析器:“name_analyzer” – karmi

+0

想通了我需要添加索引,但回应对我来说没有多大意义。当然,它发现了一堆令牌,因为我期望它们被ngram标记,但这并不能解释为什么它不包含在搜索中(至少,它不是我清楚) – HannesFostie

0

我遇到了同样的问题,我唯一想到的就是用“?”替换空格字符。通配符。它看起来像默认的标记符以及我在查询字符串搜索中特别要求的那个被忽略。