零基础入门 elasticsearch (query专辑)

167 阅读3分钟

query 查询

'query': { 'bool': { 'must': mustArray } }

mustArray 是一个数组,用于构建 Elasticsearch 查询的 must 条件。must 条件表示所有的条件都必须匹配。

查询时间在 beginTime 和 endTime 之间的数据

exports.getQueryWithMust = async (req, res) => {
  const searchQuery = {
    query: {
      bool: {
        must: [
          {
            range: {
              request_time: {
                gt: req.body.beginTime,
                lt: req.body.endTime,
              },
            },
          },
        ],
      },
    },
  };

  client
    .search({
      index: "students",
      body: searchQuery,
    })
    .then((response) => {
      res.status(200).json({
        data: response.body.hits.hits,
      });
    })
    .catch((error) => {
      console.error(error);
    });
};

term 查询

是 Elasticsearch 中的一种查询类型,用于精确匹配某个字段的值。它会查找指定字段中与给定值完全匹配的文档。

exports.getQueryWithMust = async (req, res) => {
  const searchQuery = {
    query: {
      term: {
        "db_type.keyword": req.body.db_type,
      },
    },
  };

  client
    .search({
      index: "students",
      body: searchQuery,
    })
    .then((response) => {
      // ....
    })
    .catch((error) => {
      console.error(error);
    });
};

aggs 聚合

是 Elasticsearch 中一种强大的功能,可以对文档进行分组、统计和计算等操作。

'aggs': aggQuery,

在刚刚使用 query 获取对应时间区间的数据,计算年龄的平均值。

定义了一个名为 avg_age 的聚合操作,使用 avg 聚合类型来计算 age 字段的平均值。field 字段指定了要应用聚合的字段名称。

exports.getQueryWithMust = async (req, res) => {
  const searchQuery = {
    query: {
      // ......
    },
    aggs: {
      avg_age: {
        avg: {
          field: 'age'
        }
      }
    }
  };

  client
    .search({
      index: "students",
      body: searchQuery,
    })
    .then((response) => {
      const avgAge = response.body.aggregations.avg_age.value;
      // .....
    })
    .catch((error) => {
      console.error(error);
    });
};

_source

指定你想要检索的文档字段。例如,如果你只想获取文档的特定字段,你可以通过 _source 参数进行配置。

exports.getQueryWithMust = async (req, res) => {
  const searchQuery = {
    // ....
    "_source": ["db_type"],
    // ....
    },
  };
  // ....
};

接下来,来看一个比较长的

const searchQuery = {
  aggs: {
    over_time: {
      date_histogram: {
        field: "request_time",
        interval: "year",
        time_zone: "+08:00",
        min_doc_count: 0,
        extended_bounds: {
          min: "2021-01-01T00:00:00Z",
          max: "2023-12-31T23:59:59Z"
        }
      },
      aggs: {
        db: {
          terms: { field: "db_type.keyword" },
          aggs: {
            avg_age: { avg: { field: "age" } },
            max_rt: { max: { field: "rt" } }
          }
        }
      }
    }
  },
  size: 0
}

over_time: 是一个自定义的聚合名称,用于标识时间直方图聚合操作。

date_histogram: 是一个时间直方图聚合操作,用于按指定的时间间隔对文档进行聚合。在这里,我们按年份进行聚合。

field: 指定要聚合的字段名称,这里是 "request_time",表示按照文档中的 "request_time" 字段进行聚合。

interval: 指定时间间隔的单位,这里是 "year",表示按年份进行聚合。

time_zone: 指定聚合结果中的时间区域,这里是 "+08:00",表示东八区时区。

min_doc_count: 指定每个时间桶中的最小文档计数,这里是 0,表示即使没有文档落在某个时间桶内,也会返回该时间桶。

extended_bounds: 指定时间范围的上下界,这里是 "2021-01-01T00:00:00Z" 到 "2023-12-31T23:59:59Z",表示聚合的时间范围从 2021 年到 2023 年。

aggs: 是对时间直方图聚合结果进行嵌套聚合的子聚合操作。

db: 是一个术语(Terms)聚合操作,用于按指定字段的值进行聚合。这里我们按 "db_type.keyword" 字段进行聚合。

field: 指定要聚合的字段名称,这里是 "db_type.keyword",表示按照文档中的 "db_type" 字段进行聚合。

aggs: 是对聚合结果进行嵌套聚合的子聚合操作。

avg_age: 是一个平均值(Average)聚合操作,用于计算指定字段的平均值。这里我们计算 "age" 字段的平均值。

field: 指定要计算平均值的字段名称,这里是 "age"。

max_rt: 是一个最大值(Max)聚合操作,用于计算指定字段的最大值。这里我们计算 "rt" 字段的最大值。

field: 指定要计算最大值的字段名称,这里是 "rt"。

size: 指定返回的文档数量,这里是 0,表示仅返回聚合结果,不返回具体的文档。

这个查询将执行以下操作:

  1. 过滤出年龄大于20且小于100的文档。
  2. 按年份对文档进行分桶,并计算每个月份内每种 db_type 的平均年龄和最大 rt 值。
  3. 返回的结果中,不包含实际的文档,只包含聚合结果。