我想对Elasticsearch的电子邮件或电话进行模糊匹配。例如:
匹配所有以结尾的电子邮件 @gmail.com
要么
匹配所有电话开头136
。
我知道我可以使用通配符
{
"query": {
"wildcard" : {
"email": "*gmail.com"
}
}
}
但是性能很差。我尝试使用regexp:
{"query": {"regexp": {"email": {"value": "*163\.com*"} } } }
但是不起作用。
有更好的方法吗?
curl -XGET本地主机:9200 / user_data
{
"user_data": {
"aliases": {},
"mappings": {
"user_data": {
"properties": {
"address": {
"type": "string"
},
"age": {
"type": "long"
},
"comment": {
"type": "string"
},
"created_on": {
"type": "date",
"format": "dateOptionalTime"
},
"custom": {
"properties": {
"key": {
"type": "string"
},
"value": {
"type": "string"
}
}
},
"gender": {
"type": "string"
},
"name": {
"type": "string"
},
"qq": {
"type": "string"
},
"tel": {
"type": "string"
},
"updated_on": {
"type": "date",
"format": "dateOptionalTime"
},
}
}
},
"settings": {
"index": {
"creation_date": "1458832279465",
"uuid": "Fbmthc3lR0ya51zCnWidYg",
"number_of_replicas": "1",
"number_of_shards": "5",
"version": {
"created": "1070299"
}
}
},
"warmers": {}
}
}
映射:
{
"settings": {
"analysis": {
"analyzer": {
"index_phone_analyzer": {
"type": "custom",
"char_filter": [ "digit_only" ],
"tokenizer": "digit_edge_ngram_tokenizer",
"filter": [ "trim" ]
},
"search_phone_analyzer": {
"type": "custom",
"char_filter": [ "digit_only" ],
"tokenizer": "keyword",
"filter": [ "trim" ]
},
"index_email_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [ "lowercase", "name_ngram_filter", "trim" ]
},
"search_email_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [ "lowercase", "trim" ]
}
},
"char_filter": {
"digit_only": {
"type": "pattern_replace",
"pattern": "\\D+",
"replacement": ""
}
},
"tokenizer": {
"digit_edge_ngram_tokenizer": {
"type": "edgeNGram",
"min_gram": "3",
"max_gram": "15",
"token_chars": [ "digit" ]
}
},
"filter": {
"name_ngram_filter": {
"type": "ngram",
"min_gram": "3",
"max_gram": "20"
}
}
}
},
"mappings" : {
"user_data" : {
"properties" : {
"name" : {
"type" : "string",
"analyzer" : "ik"
},
"age" : {
"type" : "integer"
},
"gender": {
"type" : "string"
},
"qq" : {
"type" : "string"
},
"email" : {
"type" : "string",
"analyzer": "index_email_analyzer",
"search_analyzer": "search_email_analyzer"
},
"tel" : {
"type" : "string",
"analyzer": "index_phone_analyzer",
"search_analyzer": "search_phone_analyzer"
},
"address" : {
"type": "string",
"analyzer" : "ik"
},
"comment" : {
"type" : "string",
"analyzer" : "ik"
},
"created_on" : {
"type" : "date",
"format" : "dateOptionalTime"
},
"updated_on" : {
"type" : "date",
"format" : "dateOptionalTime"
},
"custom": {
"type" : "nested",
"properties" : {
"key" : {
"type" : "string"
},
"value" : {
"type" : "string"
}
}
}
}
}
}
}
一种简单的方法是创建一个自定义分析器,该分析器使用电子邮件的n-gram令牌过滤器(=>参见下文index_email_analyzer
,search_email_analyzer
+
email_url_analyzer
进行精确的电子邮件匹配)和电话的edge-
ngram令牌过滤器
(=>参见下文index_phone_analyzer
和search_phone_analyzer
)。
完整的索引定义在下面提供。
PUT myindex
{
"settings": {
"analysis": {
"analyzer": {
"email_url_analyzer": {
"type": "custom",
"tokenizer": "uax_url_email",
"filter": [ "trim" ]
},
"index_phone_analyzer": {
"type": "custom",
"char_filter": [ "digit_only" ],
"tokenizer": "digit_edge_ngram_tokenizer",
"filter": [ "trim" ]
},
"search_phone_analyzer": {
"type": "custom",
"char_filter": [ "digit_only" ],
"tokenizer": "keyword",
"filter": [ "trim" ]
},
"index_email_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [ "lowercase", "name_ngram_filter", "trim" ]
},
"search_email_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [ "lowercase", "trim" ]
}
},
"char_filter": {
"digit_only": {
"type": "pattern_replace",
"pattern": "\\D+",
"replacement": ""
}
},
"tokenizer": {
"digit_edge_ngram_tokenizer": {
"type": "edgeNGram",
"min_gram": "1",
"max_gram": "15",
"token_chars": [ "digit" ]
}
},
"filter": {
"name_ngram_filter": {
"type": "ngram",
"min_gram": "1",
"max_gram": "20"
}
}
}
},
"mappings": {
"your_type": {
"properties": {
"email": {
"type": "string",
"analyzer": "index_email_analyzer",
"search_analyzer": "search_email_analyzer"
},
"phone": {
"type": "string",
"analyzer": "index_phone_analyzer",
"search_analyzer": "search_phone_analyzer"
}
}
}
}
}
现在,让我们一点一点地剖析它。
对于该phone
字段,其想法是使用来索引电话值index_phone_analyzer
,该索引使用edge-
ngram标记器来索引电话号码的所有前缀。所以,如果您的电话号码1362435647
,下面的标记会产生:1
,13
,136
,1362
,13624
,136243
,1362435
,13624356
,13624356
,136243564
,1362435647
。
然后,在搜索时,我们使用另一个分析器search_phone_analyzer
,该分析器将简单地获取输入数字(例如136
),并phone
使用简单match
或term
查询将其与字段进行匹配:
POST myindex
{
"query": {
"term":
{ "phone": "136" }
}
}
对于该email
字段,我们以类似的方式进行操作,因为我们使用来对电子邮件值进行索引,该索引index_email_analyzer
使用了ngram令牌过滤器,该过滤器将生成所有可能的长度不同(在1到20个字符之间)的令牌,这些令牌可以从电子邮件值。例如:john@gmail.com
将被标记化到j
,jo
,joh
,…
gmail.com
,… john@gmail.com
。
然后在搜索时,我们将使用另一个名为的分析器search_email_analyzer
,它将接受输入并尝试将其与索引标记进行匹配。
POST myindex
{
"query": {
"term":
{ "email": "@gmail.com" }
}
}
该email_url_analyzer
分析仪并没有在本例中使用,但我已经为了以防万一,你需要确切的电子邮件值匹配包括它。
我有一个使用commons电子邮件的项目(http://search.maven.org/#artifactdetails|组织。阿帕奇。commons | commons电子邮件| 1.2 | jar)通过maven发送。我想使用电子邮件模拟类(http://commons.apache.org/email/testapidocs/org/apache/commons/mail/mocks/Mo
问题内容: 在我的中,我具有以下内容: 我的电子邮件代码: 当然,如果通过设置调试服务器,则可以在终端中看到该电子邮件。 但是,我实际上如何不将电子邮件发送到调试服务器,而是发送到user@gmail.com? 阅读你的答案后,让我弄明白一点: 你不能使用localhost(简单的ubuntu pc)发送电子邮件吗? 我认为在django 1.3中已经过时了,取而代之的是? 问题答案: 将电子邮件
问题内容: poplib或imaplib似乎都没有提供代理支持,尽管我尝试了google-fu,但我找不到很多有关它的信息。 我正在使用python从支持imap / pop的各种服务器上获取电子邮件,并且需要能够通过代理进行处理。 理想情况下,如果我找不到更好的方法,我希望能够直接在python中进行操作,但使用包装器(基于外部程序/脚本,基于OSX)强制所有流量通过代理即可。 有人可以帮我吗?
每个社区都需要发送电子邮件给用户,用来激活账户、重置密码、接收通知以及与其他用户通讯交流。作为论坛管理员,您首先要做的几件事之一就是配置好论坛的邮件服务!配置错误的话,用户在注册时会收到报错。 Flarum 默认提供以下所列驱动,若有需要,开发者可自行开发插件添加 自定义邮件驱动。 这是最常用的邮件驱动,需要您配置主机地址、端口、加密方式、用户名和密码,以使用外部 SMTP 服务。请注意,加密方式
请让我知道通过邮件自动发送TestNG可电子邮件报告而不添加外部jar的最佳方式。
问题内容: 我正在尝试使用 Go通过gmail API 发送电子邮件,但我发现文档存在缺陷/令人困惑。有一次我没有看到收据字段或电子邮件正文。 我不需要上传任何内容,因此我发现简单上传,分段上传,可恢复的上传方法完全没有用。是否有任何清晰的演示(带有所需的数据/参数,例如cURL有效负载)? 顺便提一句,我不确定是否我是唯一一个想到这一点的人,但是除非有可用的库,否则Google api似乎在可用