如何解决如何使用elasticsearch从带有正则表达式的文本中查询电子邮件
我想从存储在 es 中的文本中查询所有电子邮件,现在我使用了这个查询词并得到了 query result
sync with firebase
}
然后,我尝试查询“\@”却什么也没得到
解决方法
这是一个使用 uax url email tokenizer 的解决方案。这将在索引时完成大部分工作,使您的搜索速度更快。
使用自定义分析器创建索引以创建
PUT test-index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer","filter": ["extract_email"]
}
},"tokenizer": {
"my_tokenizer": {
"type": "uax_url_email","max_token_length": 50
}
},"filter": {
"extract_email": {
"type": "keep_types","types": [ "<EMAIL>" ]
}
}
}
},"mappings" : {
"properties" : {
"sys_content" : {
"type" : "text","fields": {
"email": {
"type": "text","analyzer": "my_analyzer"
}
}
}
}
}
}
然后添加一个文档:
POST test-index/_doc
{
"sys_content": "test email@gmail.com not@ a@a email another@email.fr"
}
最后搜索并突出显示电子邮件。由于 uax url 电子邮件标记器,在索引时已经完成了查找电子邮件,因此在搜索时,您只需匹配 sys_content.email
字段中的任何标记:
GET test-index/_search
{
"query": {
"regexp": {
"sys_content.email": {
"value": ".*","flags": "ALL","case_insensitive": true,"max_determinized_states": 10000,"rewrite": "constant_score"
}
}
},"highlight": {
"pre_tags": [
"<span style='color:red'>"
],"post_tags": [
"</span>"
],"fragment_size": 100,"require_field_match": true,"fields": {
"sys_content.email": {}
}
}
}
这会产生以下结果:
{
"took" : 3,"timed_out" : false,"_shards" : {
"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0
},"hits" : {
"total" : {
"value" : 1,"relation" : "eq"
},"max_score" : 1.0,"hits" : [
{
"_index" : "test-index","_type" : "_doc","_id" : "GxSbM3oBJxdf7EzzH4jM","_score" : 1.0,"_source" : {
"sys_content" : "test email@gmail.com not@ a@a email another@email.fr"
},"highlight" : {
"sys_content.email" : [
"test <span style='color:red'>email@gmail.com</span> not@ a@a email <span style='color:red'>another@email.fr</span>"
]
}
}
]
}
}
注意:必须有更好的方法来匹配字段中的任何标记而不使用正则表达式搜索,但我找不到它。无论如何,这是有效的,并且正则表达式非常简单,因此应该很快。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。