ElasticSearch-匹配带有模糊搜索字母数字的查询

时间:2018-11-07 12:23:42

标签: java elasticsearch curl kibana elastic-stack

使用具有模糊性的匹配查询并查询字母数字项,结果将无法正确显示。

请找到我下面在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"
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

模糊匹配允许将“模糊”相似的两个单词视为相同的单词。 Elasticsearch使用Damareau-Levenshtein距离来测量两个字符串的相似性。 Damareau-Levenshtein距离用于测量单个字符对字符串的编辑次数,可以进行四种编辑:

  • 用一个字符替换另一个:_f_ox→_b_ox
  • 插入新字符:sic→sic_k_
  • 删除字符:b_l_ack→返回
  • 两个相邻字符的转换:_st_ar→_ts_ar

在搜索请求中,使用fuzziness参数控制编辑距离。您在fuzziness中指定了1,这意味着Elasticsearch将仅返回通过对“ A661752110”进行一次编辑(替换,插入,删除或换位)而获得的字符串。

您希望未出现的单词的编辑距离严格大于1。请注意,在Elasticsearch中,授权的最大值为2。

一些实现您想要的建议:

  • 如果您希望A661752110-12A661752110-111匹配。您可以使用令牌生成器在找到-时拆分文本。例如,这就是标准标记器的功能。
  • 如果您进一步想要A66175211012A661752110111,最好的选择是使用这样的正则表达式查询

{ "query": { "regexp": { "values": { "value": "A661752110.{,3}" } } } }