我希望找到在数据库中收到某种电子邮件的所有用户:
'user' :
{
'properties':
{
'user_name': { 'type': 'string', 'index' : 'not_analyzed' },
'about': { 'type': 'object' },
}
}
about字段是一个JSON对象,可能如下所示:
{"nickname":"bobby McBob", "contact":"bobmcbob@gmail.com", "hobbies":"tennis"}
但没有预定的结构。
我希望找到所有拥有字符串的用户,其方式符合 @ .com模式,希望这会返回所有有电子邮件的用户。
我该怎么做?
即使是一个简单的查询,也可以找到gmails,例如
curl -X GET 'http://localhost:9200/index_name/user/_search' -d '{"query":{"match":{"_all":"gmail.com"}}}'
不起作用。也许我应该在索引时使用不同的分析器分析“关于”对象?分开/标记它?
我应该使用不同的查询吗?
我该怎么做?
答案 0 :(得分:0)
您可以使用pattern tokenizer
捕获模式abc.com
,并在分析器中将其用于字段about
(analyzer_emaildomain
)。 E.g:
"analysis":{
"analyzer":{
"analyzer_emaildomain": {
"tokenizer": "emaildomain_tokenizer"
}
},
"tokenizer" : {
"emaildomain_tokenizer" : {
"type": "pattern",
"pattern" : "\\b[a-zA-Z0-9._%+-]+@([a-zA-Z0-9.-]+\\.com)\\b",
"group":1
}
}
}
您可以在设置中看到我捕获了第1组,这是@
之后以.com
结尾的任何字母字符,并且会为您的案例捕获gmail.com
。有关模式标记符的更多信息,请访问http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-pattern-tokenizer.html