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

时间:2017-02-03 15:03:25

标签: elasticsearch hunspell

我们已将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中会做的事情,但我不太确定从哪里开始......?

1 个答案:

答案 0 :(得分:1)

您将无法处理此令牌化程序级别,但您可以在映射级别调整配置以使用multi-fields,您可以保留不会被分析的相同字段的副本,稍后在查询中使用此字段支持你的用例。

您可以更新映射,如下所示

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

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

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

希望这会有所帮助 感谢