【问题标题】:ElasticSearch - Match Query with fuzziness searching alphanumericElasticSearch - 匹配查询与模糊搜索字母数字
【发布时间】:2018-11-07 12:23:42
【问题描述】:

使用模糊匹配查询并查询字母数字术语,结果不正确。

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

【问题讨论】:

    标签: java elasticsearch curl kibana elastic-stack


    【解决方案1】:

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

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

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

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

    实现你想要的一些建议:

    • 如果您希望A661752110-12A661752110-111 匹配。您可以使用分词器在找到- 时拆分文本。例如,这就是标准标记器所做的。
    • 如果您还需要A66175211012A661752110111,最好的选择是使用这样的正则表达式查询

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

    【讨论】:

    • regexp 不会满足我的要求,因为A661752110 只是一个例子。同样,我有许多不同形式的值要搜索。但它全是字母数字。例如:bcf84729xc948xcs90 明智的做法。
    • 你有几个?您可以使用布尔查询将多个查询组合成一个 AND 查询elastic.co/guide/en/elasticsearch/reference/current/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 2018-03-22
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    相关资源
    最近更新 更多