Elasticsearch 异步搜索 Async search 实战

2021-11-12 14:15:07 浏览数 (1)

1、Elasticsearch 异步搜索定义

异步搜索 API 可异步执行搜索请求、监控其进度并检索可用的部分结果。

如下的官方介绍动画,能更加生动的介绍清楚异步检索。

传统检索 VS 异步检索,在数据量比较大时:

  • 传统检索可能导致超时,以至于无数据返回;或者需要等待很久,用户体验差。
  • 异步检索,可以快速响应数据,用户无需等待。

2、Elasticsearch 异步搜索发布的版本

Elasitcsearch V7.7.0版本。

3、Elasticsearch 异步搜索适用场景

异步搜索允许用户在异步搜索结果可用时检索它们,从而消除了仅在查询完全完成后才最终响应的情况。

4、Elasticsearch 异步搜索实战

4.1 执行异步检索

执行如下操作的前提是:待异步检索的索引数据量非常大(其实小了也可以,但数据量大更契合一些)。

否则普通索引会直接返回结果数据。

拿个普通索引试验一下:

代码语言:javascript复制
POST kibana_sample_data_flights/_async_search?size=0
{
  "sort": [
    {
      "timestamp": {
        "order": "asc"
      }
    }
  ],
  "aggs": {
    "sale_date": {
      "date_histogram": {
        "field": "timestamp",
        "calendar_interval": "1d"
      }
    }
  }
}

返回结果:

代码语言:javascript复制
{
  "is_partial" : false,
  "is_running" : false,
  "start_time_in_millis" : 1628663114252,
  "expiration_time_in_millis" : 1629095114252,
  "response" : {
    "took" : 23,
    "timed_out" : false,
    "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
    },
    "hits" : {
      "total" : {
        "value" : 10000,
        "relation" : "gte"
      },
      "max_score" : null,
      "hits" : [ ]
    },

为了达到异步检索的目的,可以用推荐的测试写入数据的工具:

代码语言:javascript复制
https://github.com/oliver006/elasticsearch-test-data

你是不是也困惑,没有测试数据或者没有一定数量的测试数据?小工具来了。

产生100W 数据,一条指令:

代码语言:javascript复制
python es_test_data.py --es_url=http://172.21.0.14:19205 --count=1000000

结果如下:

代码语言:javascript复制
Done - total docs uploaded: 1000000, took 71 seconds

可以结合自己业务场景优化一下,python 代码编写,很适合封装成自己的小工具。

有了数据,异步检索直接开搞!

代码语言:javascript复制
POST test_data/_async_search?size=0
{
  "sort": [
    {
      "last_updated": {
        "order": "asc"
      }
    }
  ],
  "aggs": {
    "sale_date": {
      "date_histogram": {
        "field": "last_updated",
        "calendar_interval": "1d"
      }
    }
  }
}

返回结果如下:

代码语言:javascript复制
{
  "id" : "FjUxQURkZFZyUVVlUUNydjVSZXhmWGcedFJCVnRVSVhSdVM0emN2YXZfTU9ZQToyNzE3MTcy",
  "is_partial" : true,
  "is_running" : true,
  "start_time_in_millis" : 1628662256012,
  "expiration_time_in_millis" : 1629094256012,
  "response" : {
    "took" : 1008,
    "timed_out" : false,
    "terminated_early" : false,
    "num_reduce_phases" : 0,
    "_shards" : {
      "total" : 1,
      "successful" : 0,
      "skipped" : 0,
      "failed" : 0
    },
    "hits" : {
      "total" : {
        "value" : 0,
        "relation" : "gte"
      },
      "max_score" : null,
      "hits" : [ ]
    }
  }
}

如果看不到上述结果,说明数据量还不够大。可以再导入一些。

核心返回参数解释一下:

  • id——可用于监控其进度、检索其结果和/或删除它的异步搜索的标识符。
  • is_partial——当查询不再运行时,指示在所有分片上搜索是失败还是成功完成。在执行查询时,is_partial 始终设置为 true。
  • is_running——搜索是否仍在执行中或已完成。
  • total——总体而言,将在多少个分片上执行搜索。
  • successful——有多少分片已成功完成搜索。

4.2 查看异步检索

代码语言:javascript复制
GET /_async_search/FjFoeU8xMHJKUW9pd1dzN1g2Rm9wOGcedFJCVnRVSVhSdVM0emN2YXZfTU9ZQToyNjYyNjk5

4.3 查看异步检索状态

代码语言:javascript复制
GET /_async_search/status/FjUxQURkZFZyUVVlUUNydjVSZXhmWGcedFJCVnRVSVhSdVM0emN2YXZfTU9ZQToyNzE3MTcy/

4.4 删除/中止异步检索

代码语言:javascript复制
DELETE /_async_search/FjFoeU8xMHJKUW9pd1dzN1g2Rm9wOGcedFJCVnRVSVhSdVM0emN2YXZfTU9ZQToyNjYyNjk5

5、官方文档地址

https://www.elastic.co/guide/en/elasticsearch/reference/current/async-search.html

6、小结

异步搜索认证考试环节,大家了解就可以,能找到官方文档位置,知道有哪几个API。

实战业务环节结合业务需求去选型使用即可。但,更倾向于数据量极大的业务传统同步请求体验差的场景。

0 人点赞