合并 hunspell 过滤器后在 elasticSearch 中完全匹配

exact match in elasticSearch after incorporating hunspell filter

我们已将 hunspell 过滤器添加到我们的弹性搜索实例中。没什么好看的...

{
"index" : {
    "analysis" : {
        "tokenizer" : {
            "comma" : {
                "type" : "pattern",
                "pattern" : ","
            }
        },            
          "filter": {
            "en_GB": {
              "type": "hunspell",
              "language": "en_GB"
            }
          },
        "analyzer" : {
            "comma" : {
                "type" : "custom",
                "tokenizer" : "comma"
            },
            "en_GB": {
              "filter": [
                "lowercase",
                "en_GB"
              ],
              "tokenizer": "standard"
            }
        }        
    }
}
}

现在虽然我们似乎已经失去了使用引号进行精确匹配查询的内置工具。例如,搜索 "lace" 也会对 "lacy" 进行等分搜索。我知道这是包含 hunspell 的一点,但我希望能够通过使用引号

强制精确匹配

顺便说一句,我正在为此做布尔查询。按照(java)

"bool" : {
    "must" : {
      "query_string" : {
        "query" : "\"lace\"",
        "fields" : 
        ...

或(邮递员直达 9200 ...

{
"query" : { 
  "query_string" : {
    "query" : "\"lace\"",
    "fields" :
....

这可能吗?我猜这可能是我们会在 tokaniser 中做的事情,但我不太确定从哪里开始...?

您将无法处理此分词器级别,但您可以在映射级别调整配置以使用 multi-fields,您可以保留同一字段的副本,该字段不会被分析,稍后使用它查询以支持您的用例。

您可以像下面这样更新您的映射

"mappings": {
        "desc": {
        "properties": {
           "labels": {
              "type": "string",
              "analyzer": "en_GB",
              "fields": {
              "raw": { 
              "type":  "keyword"
              }
            }
           }
        }
     }
    }

进一步修改您的查询以搜索原始字段而不是分析字段。

{
    "query": {
        "bool": {
            "must": [{
                "query_string": {
                    "default_field": "labels.raw",
                    "query": "lace"
                }
            }]
        }
    }
}

希望对您有所帮助 谢谢