我有一个分析的字段,其中包含以下内容:'quick brown foxes'和另一个包含:'quick brown 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
}
}
}
}
}
}
}
我尝试过的查询:match,term,span_term,query_string。所有都在text和text.raw字段上执行。
答案 0 :(得分:2)
"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
}