Elasticsearch通配符搜索电子邮件地址?
问题描述:
我正在尝试为我正在使用的项目使用elasticsearch设置。我不知道是否有人能够帮助他们在正确的方向前进。我使用的索引有1亿多条记录。
如果我需要能够通配符查询类似如下:Elasticsearch通配符搜索电子邮件地址?
b*[email protected]
b*[email protected]*.com
*[email protected]
br*gu*@gmail.com
*g*@*
当我尝试使用通配符和其它的搜索,我没有得到完全预期的结果。
使用elasticsearch进行什么类型的搜索应该考虑实现? ElasticSearch甚至是正确的工具吗?我从中得出的是Mysql,所以如果没有,我可能会考虑使用Sphinx或Solr。
答
我假设您已经按照here所述的方法试用了通配符查询。
但是,如果您的电子邮件被分析而不是分析,它会有非常不同的行为。我建议你删除你的索引并改变你的映射。例如
PUT /emails
{
"mappings": {
"email": {
"properties": {
"email": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
一旦你有了这个,你可以做普通的通配符查询或query_string。例如
GET emails/_search
{
"query": {
"wildcard": {
"email": {
"value": "s*com"
}
}
}
}
顺便说一句,如果你不将其设置为not_analyzed只是指数的电子邮件,默认的映射实际上分裂了从域名的电子邮件前缀,所以这就是为什么你没有得到结果,当你做S代表* @ gmail.com。你仍然会得到s *或* gmail.com的结果,但对于你的情况,使用not_analyzed可以正常工作。如果您要支持不区分大小写,那么您可能需要查看使用如here所述的uax_url_email标记器的自定义分析器。
对于电子邮件搜索,我建议这种方法:http://stackoverflow.com/questions/30115867/elasticsearch-analyzer-and-tokenizer-for-emails –