elastic 邮箱分词器改造

应用背景

对于存储邮箱会有以下形式:analyzer: standard

"from": {"type":"text","fields":{"keyword":{"ignore_above":256,"type":"keyword"}}}

这样即支持term的精确匹配,也支持全文检索

检所需求

对于邮箱为 [email protected],期望检索 bbbb.com来命中该邮箱,但结果却不可以;以分词结果为例:

xxx
123
aaaa.bbbb.com

以standard的规则为例:数字、字母、符号会有一些强规则;就是不会再细分。

解决方案

standard 分词器属于 elastic 内嵌的分词器,修改源码较困难,所以提供以下两种解决方案:

  • 自定义分词器
    自己实现按照邮箱正则分词,为邮箱分词字段提供即可
  • ngram & token_chars
{
    "settings":{
        "analysis":{
            "analyzer":{
                "autocomplete":{
                    "tokenizer":"autocomplete",
                    "filter":[
                        "lowercase"
                    ]
                },
                "autocomplete_search":{
                    "tokenizer":"lowercase"
                }
            },
            "tokenizer":{
                "autocomplete":{
                    "type":"ngram",
                    "min_gram":2,
                    "max_gram":100,
                    "token_chars":[
                        "letter",
                        "digit",
                        "symbol"
                    ]
                }
            }
        }
    },
    "mappings":{
        "doc":{
            "properties":{
                "title":{
                    "type":"text",
                    "analyzer":"autocomplete",
                    "search_analyzer":"autocomplete_search",
                    "fields":{
                        "keyword":{
                            "type":"keyword",
                            "ignore_above":256
                        }
                    }
                }
            }
        }
    }
}

邮箱会依次按照 "letter","digit","symbol" 按照字节分词,并形成 gram,由于邮箱比较短小,max_gram:100 完全足够
查询:

"term":{"from":"bbbb.com"}

完全可以正常查询

你可能感兴趣的:(elastic 邮箱分词器改造)