Elasticsearch批量或搜索

时间:2015-04-15 02:37:48

标签: elasticsearch

背景

我正在开发一个API,允许用户传递有关成员的详细信息列表(名称,电子邮件地址......)我想使用此信息来匹配我的Elasticsearch数据库中的帐户记录和返回潜在匹配列表。

我认为这就像在我想要的字段上执行bool查询一样简单,但是我似乎没有点击。

我对Elasticsearch比较陌生,我目前的_search请求看起来像这样。

示例查询

POST / member / account / _search

{
    "query" : {
        "filtered" : {
            "filter" : {
                "bool" : {
                    "should" [{
                        "term" : {
                             "email": "jon.smith@gmail.com"
                        }
                    },{
                        "term" : {
                             "email": "samy@gmail.com"
                        }
                    },{
                        "term" : {
                             "email": "bo.blog@gmail.com"
                        }
                    }]
                }
            }
        }
    }
}

问题

如何更新此查询以返回与任何电子邮件地址匹配的记录?

我可以优先处理与电子邮件和其他字段匹配的记录吗?示例“family_name”。

如果我需要针对几百个电子邮件地址执行此操作,这会成为问题吗?

1 个答案:

答案 0 :(得分:1)

嗯,您需要在索引端而不是查询端进行更改。

默认情况下,您的电子邮件ID会被分解 jon.smith@gmail.com => [jon,smith,gmail,com]

索引时。

现在当你使用术语查询进行搜索时,它不会应用分析器,它会尝试获得jon.smith@gmail.com的完全匹配,正如你所看到的,它不会工作。 即使您使用匹配查询,您最终也会将所有文档作为匹配项。 因此,您需要将映射更改为索引电子邮件ID作为单个标记,而不是将其标记化。 因此,使用not_analyzed将是最佳解决方案。 将电子邮件字段定义为not_analyzed时,索引时会发生以下情况。 jon.smith@gmail.com => [jon.smith@gmail.com]

更改映射并索引所有文档后,现在可以自由运行上述查询。

我建议使用术语查询,如下所示 -

{
  "query": {
    "terms": {
      "email": [
        "jon.smith@gmail.com",
        "samy@gmail.com",
        "bo.blog@gmail.com"
      ]
    }
  }
}

要回答问题的第二部分 - 您正在寻求提升,并建议您完成function score query