Lucene ElasticSearch同义词和单词分隔符分析器不兼容
我有一个下面的映射文档,确切地说,它确实在索引和搜索时间应用了word delimiter analyzer,专门用于模型字段和同义词analyzer,它对搜索字符串进行搜索时间分析 映射Lucene ElasticSearch同义词和单词分隔符分析器不兼容,lucene,
elasticsearch,Lucene,
elasticsearch,我有一个下面的映射文档,确切地说,它确实在索引和搜索时间应用了word delimiter analyzer,专门用于模型字段和同义词analyzer,它对搜索字符串进行搜索时间分析 映射 POST /stackoverflow { "settings":{ "analysis":{ "analyzer":{ "keyword_analyzer":{ "tokenizer":"keyword",
POST /stackoverflow
{
"settings":{
"analysis":{
"analyzer":{
"keyword_analyzer":{
"tokenizer":"keyword",
"filter":[
"lowercase",
"asciifolding"
]
},
"synonym_analyzer":{
"tokenizer":"standard",
"filter":[
"lowercase",
"synonym"
],
"expand":false,
"ignore_case":true
},
"word_delimiter_analyzer":{
"tokenizer":"whitespace",
"filter":[
"lowercase",
"word_delimiter"
],
"ignore_case":true
}
},
"filter":{
"synonym":{
"type":"synonym",
"synonyms_path":"synonyms.txt"
},
"word_delimiter":{
"type":"word_delimiter",
"generate_word_parts":true,
"preserve_original": true
}
}
}
},
"mappings":{
"vehicles":{
"dynamic":"false",
"dynamic_templates":[
{
"no_index_template":{
"match":"*",
"mapping":{
"index":"no",
"include_in_all":false
}
}
}
],
"_all":{
"enabled":false
},
"properties":{
"id":{
"type":"long",
"ignore_malformed":true
},
"model":{
"type":"nested",
"include_in_root":true,
"properties":{
"label":{
"type":"string",
"analyzer": "word_delimiter_analyzer"
}
}
},
"make":{
"type":"String",
"analyzer":"keyword_analyzer"
}
}
}
}
}
并给出了一些样本数据
POST /stackoverflow/vehicles/6
{
"make" : "chevrolet",
"model" : {
"label" : "Silverado 2500HD"
}
}
下面是搜索查询
GET /stackoverflow/_search?explain
{
"from":0,
"size":10,
"query":{
"filtered":{
"query":{
"multi_match":{
"query":"HD2500",
"fields":[
"make","model.label"
],
"type":"cross_fields","operator" : "OR",
"analyzer" : "synonym_analyzer"
}
}
}
}
}
上面的搜索查询不起作用,相反,如果我从搜索查询中删除同义词_anazer,它会很好地工作。我真的不明白同义词分析器如何篡改结果背后的逻辑
在我的synonym.txt文件中,我没有任何对HD2500的引用,而synonym analyzer所做的只是通过空格分割标记,并将其转换为小写,然后尝试匹配同义词字符串,然后将其传递给字段级分析器,我不清楚它在哪里被破坏
非常感谢您提供的任何帮助您查询的是“HD2500”,文档中有“2500HD”,我看不出有任何理由与之匹配。我使用的是单词分隔符,它实际上将数据索引为“2500HD”、“HD”、“2500”。如果我从查询中删除synonym\u analyzer,它会工作。如果您删除synonym\u analyzer,则model.label的默认搜索分析器是word\u delimiter\u analyzer,结果查询项HD2500分为HD和2500,您会得到一个匹配项。@keety您是说,在querytime中只应用一个分析器?无论是查询级别还是字段级别,我是否理解正确?查询级别(例如:多重匹配)中指定的analyzer将分析搜索查询(HD2500),随后的标记将用于在所有字段之间进行匹配。如果未指定任何分析器,则使用字段的默认分析器,如果是标签字段,则使用word_delimiter_analyzer和make字段的关键字分析器。