在一个字段上,我想设置一个具有自定义过滤器的自定义分析器 - 重点是词干提取 - 因此"闪存卡"和"闪存卡"被词干提取到相同的根,因此返回相同的结果
当我运行以下查询时,我得到命中(很棒(,但"闪存卡"和"闪存卡"各自返回不同的结果:
{"query_string": {
"fields": ["description"],
"query": query
}
}
但是当我运行以下查询时,我没有得到任何结果:
{"query_string": {
"fields": ["description.analyzed"],
"query": query
}
}
查看下面的映射,我们看到description.analyzed
和description
具有相同的配置 - 因此每个字段的行为应该相同,并且应该进行词干提取?
如何确定分析仪正在使用中?
我的索引映射:
{'mappings': {
'file': { # doc_type
'properties': { # properties for doc_type
'description': { # field called description
'type': 'multi_field', # to allow "sub fields" with different alalysers
'fields': {
'description': {'type': 'string', 'analyzer': 'my_analyser'},
'analysed': {'type': 'string', 'analyzer': 'my_analyser'}
}
},
}
}
},
'settings': {
'analysis': {
'filter': { #declare my custin filters
'filter_ngrams': {'max_gram': 5, 'min_gram': 1, 'type': 'edgeNGram'},
'filter_stop':{'type':'stop', 'enable_position_increments': 'false'},
'filter_shingle':{'type': 'shingle', 'max_shingle_size': 5, 'min_shingle_size': 2, 'output_unigrams':'true'},
'filter_stemmer' : {'type': 'stemmer', 'name': 'english'}
},
'analyzer': { # declare custom analyzers
'my_analyser': {
'filter': ['standard', 'lowercase', 'asciifolding', 'filter_stop', 'filter_shingle', 'filter_stemmer'],
'type': 'custom',
'tokenizer': 'standard'
},
}
}
}
}
在您的映射中,您将"描述"和"分析"的分析器都设置为"my_analyser",但我假设"描述"分析器实际上应该是默认分析器或其他没有词干的东西这个问题。
无论如何,如果要对映射中的字段进行词干提取以进行索引,则还需要对实际查询文本使用词干分析器。这就是为什么你会得到不同的"抽认卡"和"抽认卡"结果的原因 - 因为你没有对查询字符串进行词干,你实际上是在执行两个不同的搜索。
我不确定这如何适用于复杂的query_string查询,但您应该修改您的查询请求
,如下所示:{"query_string": {
"fields": ["description.analyzed"],
"query": query,
"analyzer": "my_analyzer"}
或类似内容(确保指定的分析器正在对查询进行词干分析(。我很确定 ES 不会像您期望的那样尝试找出您在要搜索的字段上使用哪个分析器来分析您的查询。相反,它将使用您设置为默认值的任何分析器。
您还可以设置默认分析器(实际上,索引和搜索也可以使用不同的默认值( - 请查看 http://www.elasticsearch.org/guide/reference/index-modules/analysis/