我有索引文档,每个文档都有一个字段:“CodeName”,其值如下所示:
document 1 has CodeName: "AAA01"
document 2 has CodeName: "AAA02"
document 3 has CodeName: "AAA03"
document 4 has CodeName: "BBB02"
当我尝试在字段上使用匹配查询时:
query: {
"match": {
"CodeName": "AAA"
}
}
我希望得到“AAA01”和“AAA02”的结果,但相反,我得到一个空数组。当我传入“AAA01”(我输入整个内容)时,我得到一个结果。我如何使它更一般地匹配?我尝试使用“前缀”而不是“匹配”,我遇到了同样的问题。
“CodeName”的映射是“type”:“string”。
答案 0 :(得分:0)
据我所知,您首先应使用nGram
类型的标记化程序索引数据。
您可以查看详细信息in documentation
评论相关: 我熟悉使用elasticsearch的symfony方式,我们正在使用它:
indexes:
search:
client: default
settings:
index:
analysis:
custom_index_analyzer:
type: custom
tokenizer: nGram
filter: [lowercase, kstem]
tokenizer:
nGram:
type: nGram
min_gram: 2
max_gram: 20
types:
skill:
mappings:
skill.name:
search_analyzer: custom_index_analyzer
index_analyzer: custom_index_analyzer
type: string
boost: 1
答案 1 :(得分:0)
我希望得到“AAA01”和“AAA02”的结果
这不是Elastic Search所期望的。 ES使用您指定的标记生成器将您的字符串分解为标记。如果您没有指定任何标记器/分析器,则默认的标准标记器会在空格和连字符等上拆分单词。在您的情况下,标记存储为“AAA01”,“AAA02”等等。没有“AAA”这样的术语,因此你没有得到任何结果。
要解决此问题,您可以使用match_phrase_prefix查询或将匹配查询的类型设置为phrase_prefix。试试这段代码:
"query": {
"match_phrase_prefix": {
"CodeName": "AAA"
}
}
OR
"query": {
"match": {
"CodeName": {
"query": "AAA",
"type": "phrase_prefix"
}
}
}
以下是文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html。还要注意max_expansions参数,因为根据您的数据,此查询有时会很慢。
请注意,对于此技术,您应该使用默认映射。你不要使用nGram。