elasticsearch,Lucene,elasticsearch" /> elasticsearch,Lucene,elasticsearch" />

Lucene ElasticSearch同义词和单词分隔符分析器不兼容

Lucene ElasticSearch同义词和单词分隔符分析器不兼容,lucene,elasticsearch,Lucene,elasticsearch,我有一个下面的映射文档,确切地说,它确实在索引和搜索时间应用了word delimiter analyzer,专门用于模型字段和同义词analyzer,它对搜索字符串进行搜索时间分析 映射 POST /stackoverflow { "settings":{ "analysis":{ "analyzer":{ "keyword_analyzer":{ "tokenizer":"keyword",

我有一个下面的映射文档,确切地说,它确实在索引和搜索时间应用了word delimiter analyzer,专门用于模型字段和同义词analyzer,它对搜索字符串进行搜索时间分析

映射

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字段的关键字分析器。