Elasticsearch 未分析字段

Elasticsearch not analyzed field

我有一个包含以下内容的分析字段:'quick brown foxes' 和另一个包含:'quick brown fox'.

我想找到那些明确包含 'foxes'(不是 fox)的文档。据我所知,我必须创建一个包含已分析和未分析子字段的多字段(请参阅下面的映射)。但是我该如何查询呢?

这是一个例子(请注意,我的分析器设置为匈牙利语,但我想这在这里无关紧要):

{
    "settings" : {
        "number_of_replicas": 0,
        "number_of_shards": 1,      
        "analysis" : {
            "analyzer" : {
                "hu" : {
                    "tokenizer" : "standard",
                    "filter" : [ "lowercase", "hu_HU" ]
                }
            },
            "filter" : {
                "hu_HU" : {
                    "type" : "hunspell",
                    "locale" : "hu_HU",
                    "language" : "hu_HU"
                }               
            }
        }
    },
    "mappings": {
        "foo": {
            "_source": { "enabled": true },
            "properties": {
                "text": {
                    "type": "string",
                    "analyzer": "hu",
                    "store": false,
                    "fields": {
                        "raw": {
                            "type": "string",
                            "index": "not_analyzed",
                            "store": false
                        }
                    }
                }
            }
        }
    }
}

我尝试过的查询:匹配、术语、span_term、query_string。所有都在文本和 text.raw 字段上执行。

"index": "not_analyzed"表示这个字段根本不会被分析(https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-index.html)。所以它甚至不会被拆分成单词。我相信这不是你想要的。 取而代之的是,您需要添加新的分析器,它只包括分词器 whitespace (https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-whitespace-tokenizer.html):

"analyzer" : {
      "hu" : {
          "tokenizer" : "standard",
           "filter" : [ "lowercase", "hu_HU" ]
       },
       "no_filter":{
           "tokenizer" : "whitespace"
       }
}

那么您需要为您的领域使用这个新的分析器:

"raw": {
     "type": "string",
     "analyzer": "no_filter",
     "store": false
}