使用具有模糊性的匹配查询并查询字母数字项,结果将无法正确显示。
请找到我下面在kibana中运行的查询
GET index_name/_search
{
"query": {
"match" : {
"values" : {
"query" : "A661752110",
"operator" : "and",
"fuzziness": 1,
"boost": 1.0,
"prefix_length": 0,
"max_expansions": 100
}
}
}
}
我期望的结果如下:
A661752110
A66175211012
A661752110111
A661752110-12
A661752110-111
但是得到的结果是:
A661752110
A661752111
A661752119
请找到我的地图详细信息:
PUT index_name
{
"settings": {
"analysis": {
"analyzer": {
"attr_analyzer": {
"type": "custom",
"tokenizer": "whitespace",
"char_filter": [
"html_strip"
],
"filter": ["lowercase", "asciifolding"]
}
}
}
},
"mappings": {
"doc": {
"properties": {
"values": {
"type": "text",
"analyzer": "attr_analyzer"
},
"id":{
"type": "text"
}
}
}
}
}
答案 0 :(得分:1)
模糊匹配允许将“模糊”相似的两个单词视为相同的单词。 Elasticsearch使用Damareau-Levenshtein距离来测量两个字符串的相似性。 Damareau-Levenshtein距离用于测量单个字符对字符串的编辑次数,可以进行四种编辑:
在搜索请求中,使用fuzziness
参数控制编辑距离。您在fuzziness
中指定了1
,这意味着Elasticsearch将仅返回通过对“ A661752110”进行一次编辑(替换,插入,删除或换位)而获得的字符串。
您希望未出现的单词的编辑距离严格大于1。请注意,在Elasticsearch中,授权的最大值为2。
一些实现您想要的建议:
A661752110-12
和A661752110-111
匹配。您可以使用令牌生成器在找到-
时拆分文本。例如,这就是标准标记器的功能。 A66175211012
和A661752110111
,最好的选择是使用这样的正则表达式查询 { "query": { "regexp": { "values": { "value": "A661752110.{,3}" } } } }