我试图让用户提交查询“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'
}
}
},
最佳答案
有两种处理所有格撇号的官方方法:
1) 使用 ES 文档中描述的“possessive_english”词干分析器: 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"
}
}
}
}
}
如果您愿意,除了“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 文档: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-word-delimiter-tokenfilter.html
两者都会切断“的”。
关于elasticsearch - 在 ElasticSearch 中忽略撇号(所有格),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16201814/