elasticsearch实现多条索引检索

128 阅读1分钟

要在Elasticsearch中实现多个索引的检索,需要使用多路搜索(multi-search)API。多路搜索允许同时在多个索引中执行一个或多个搜索请求,返回一个结果集。

以下是一个使用多路搜索进行多个索引检索的示例:

GET /twitter,instagram/_msearch
{}
{"query" : {"match_all" : {}}, "from" : 0, "size" : 10}
{}
{"query" : {"match" : {"user" : "johndoe"}}, "from" : 0, "size" : 10}

上述请求会同时在名为“twitter”和“instagram”的两个索引中进行两个搜索请求。第一个搜索请求是一个匹配所有文档的搜索;第二个搜索请求是一个匹配“user”字段中包含“johndoe”的文档的搜索。

多路搜索请求由多个JSON对象组成。每个JSON对象都表示一个单独的搜索请求,以空行分隔。第一个空行表示请求头和请求体之间的分隔符。

多路搜索API的响应结果是一个JSON对象,包含每个搜索请求的响应结果。例如,如果上述请求在“twitter”和“instagram”索引中均匹配到了文档,响应结果可能是这样的:

{
  "responses" : [
    {
      "took": 1,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 2,
        "max_score": 1,
        "hits": [
          {
            "_index": "twitter",
            "_type": "_doc",
            "_id": "1",
            "_score": 1,
            "_source": {
              "text": "Hello world",
              "user": "johndoe"
            }
          },
          {
            "_index": "instagram",
            "_type": "_doc",
            "_id": "2",
            "_score": 1,
            "_source": {
              "caption": "Sunset in Bali",
              "user": "janedoe"
            }
          }
        ]
      }
    },
    {
      // 第二个搜索请求的响应结果
    }
  ]
}

响应结果的responses数组包含了每个搜索请求的结果。每个结果都包含了匹配到的文档以及其他元数据,如匹配得分、索引名称和文档ID等。