我们有一个包含 100 万条记录的数据库,我们想使用 UserID 查询电子邮件列表。
在弹性搜索中最好的方法是什么。我们不想循环单个 UID 并获取相应的电子邮件。如果我们可以通过一次批量搜索获得所有电子邮件,那就太好了。
欢迎任何想法。
我们有一个包含 100 万条记录的数据库,我们想使用 UserID 查询电子邮件列表。
在弹性搜索中最好的方法是什么。我们不想循环单个 UID 并获取相应的电子邮件。如果我们可以通过一次批量搜索获得所有电子邮件,那就太好了。
欢迎任何想法。
你可以这样试试。
POST localhost:9200/users/user/_search?pretty=true
{
"_source": "email",
"query" : {
"match" : { "userId" : "abc123" }
}
}
或者
POST localhost:9200/users/user/_search?pretty=true
{
"query" : {
"match" : { "userId":"abc123" }
},
"fields": ["email"]
}
我推荐第一个。
为此,您可以使用Multi Search API :
curl -s -XGET localhost:9200/_msearch/template -d '
{"index" : "logstash-2017.03.20"}
{"inline": {"query": {"match": {"uid" : "E434C35-B080-403C-ADA9-2FD164CF70" }}}}
{"index" : "logstash-2017.03.20"}
{"inline": {"query": {"match": {"uid" : "E1D65ED3-F3BE-42E8-AF2F-A4D4F843F7" }}}}
'
注意:每个搜索命令(对索引和查询行)必须用新行分隔,并且在最后一次查询之后必须存在新行。将查询写入文件可能更安全,例如requests
然后使用--data-binary
标志:
curl -s -XGET localhost:9200/_msearch/template --data-binary "@requests"
responses
您将为每个查询获得一个数组:
{
"responses": [
{
"took": 86,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 13.081283,
"hits": [
{ ... }
]
}
},
{
"took": 82,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 13.081283,
"hits": [
{ ... }
]
}
}
]
}