应用背景
对于存储邮箱会有以下形式:analyzer: standard
"from": {"type":"text","fields":{"keyword":{"ignore_above":256,"type":"keyword"}}}
这样即支持term的精确匹配,也支持全文检索
检所需求
对于邮箱为 xxx_123@aaaa.bbbb.com,期望检索 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"}
完全可以正常查询
网友评论