在ElasticSearch中忽略撇号(占有)

时间:2013-04-24 20:44:31

标签: elasticsearch tire

我正在尝试让用户提交的查询“Joe Frankles”,“Joe Frankle”,“Joe Frankle's”以匹配原始文本“Joe Frankle's”。现在我们正在索引这个文本所在的字段(轮胎/ Ruby格式):

{ :type => 'string', :analyzer => 'snowball' }

并搜索:

query { string downcased_query, :default_operator => 'AND' }

我尝试了这个失败:

          create :settings => {
              :analysis => {
                :char_filter => {
                   :remove_accents => {
                     :type => "mapping",
                     :mappings => ["`=>", "'=>"]
                   }
                },
                :analyzer => {
                  :myanalyzer => {
                    :type => 'custom',
                    :tokenizer => 'standard',
                    :char_filter => ['remove_accents'],
                    :filter => ['standard', 'lowercase', 'stop', 'snowball', 'ngram']
                  }
                },
                :default => {
                  :type => 'myanalyzer'
                }
            }
          },

3 个答案:

答案 0 :(得分:3)

有两种处理占有撇号的官方方式:

1)使用" possessive_english" ES文档中描述的词干分析器: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-stemmer-tokenfilter.html

示例:

{
  "index" : {
    "analysis" : {
        "analyzer" : {
            "my_analyzer" : {
                "tokenizer" : "standard",
                "filter" : ["standard", "lowercase", "my_stemmer"]
            }
        },
        "filter" : {
            "my_stemmer" : {
                "type" : "stemmer",
                "name" : "possessive_english"
            }
        }
    }
  }
}

除了'#34; possessive_english"之外,还可以使用其他限制器或雪球。过滤,如果你喜欢。应该/必须工作,但它是未经测试的代码。

2)使用" word_delimiter"过滤器:

{
  "index" : {
    "analysis" : {
        "analyzer" : {
            "my_analyzer" : {
                "tokenizer" : "standard",
                "filter" : ["standard", "lowercase", "my_word_delimiter"]
            }
        },
        "filter" : {
            "my_word_delimiter" : {
                "type" : "word_delimiter",
                "preserve_original": "true"
            }
        }
    }
  }
}

适合我:-) ES docs: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-word-delimiter-tokenfilter.html

两者都会切断"""。

答案 1 :(得分:1)

我遇到了类似的问题,单独的雪球分析仪并没有为我工作。不知道它是否应该。这是我使用的:

properties: {
  name: {
    boost: 10,
    type:  'multi_field',
    fields: {
      name:      { type: 'string', index: 'analyzed', analyzer: 'title_analyzer' },
      untouched: { type: 'string', index: 'not_analyzed' }
    }
  }
}

analysis: {
  char_filter: {
    remove_accents: {
      type: "mapping",
      mappings: ["`=>", "'=>"]
    }
  },
  filter: {},
  analyzer: {
    title_analyzer: {
      type: 'custom',
      tokenizer: 'standard',
      char_filter: ['remove_accents'],
    }
  }
}

使用分析仪时,Admin indices analyze tool也很棒。

答案 2 :(得分:0)

在您的查询中,您正在搜索_all字段,但您的分析器仅适用于单个字段。要为_all字段启用此功能,只需make snowball your default analyzer