如何在elasticsearch中找到部分匹配

时间:2013-03-01 17:47:50

标签: elasticsearch

我希望找到在数据库中收到某种电子邮件的所有用户:

'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"}}}'

不起作用。也许我应该在索引时使用不同的分析器分析“关于”对象?分开/标记它?

我应该使用不同的查询吗?

我该怎么做?

1 个答案:

答案 0 :(得分:0)

您可以使用pattern tokenizer捕获模式abc.com,并在分析器中将其用于字段aboutanalyzer_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