ElasticSearch 实现分词全文检索 - 聚合查询 cardinality

elasticsearch,实现,分词,全文检索,聚合,查询,cardinality · 浏览次数 : 284

小编点评

**ElasticSearch 实现分词全文检索** **概述** ElasticSearch 支持分词全文检索,允许您在搜索中使用多个词语或分词词语进行全文搜索。这使得您可以更精细地搜索相关文档。 **RESTful 基本操作** 使用 RESTful API 进行分词全文检索: 1. 创建一个 `SearchRequest` 对象,指定索引名称和搜索条件。 2. 创建一个 `SearchSourceBuilder` 对象,设置聚合器,例如计算文档数量。 3. 使用 `client.search()` 方法执行搜索,并获取搜索结果。 **示例** ```java // 创建搜索请求对象 SearchRequest request = new SearchRequest("indexName", "query"); // 创建聚合器 SearchSourceBuilder builder = new SearchSourceBuilder(); builder.aggregation(AggregationBuilders.terms("field_name")); // 设置聚合器 request.source(builder); // 执行搜索 SearchResponse response = client.search(request, RequestOptions.DEFAULT); // 获取搜索结果 List hits = response.hits; // 打印搜索结果 for (Hit hit : hits) { // 处理搜索结果 } ``` **统计聚合查询** 使用 `extendedStats()` 聚合器计算文档的统计信息,例如最大值、最小值、平均值等。 ```java // 创建搜索请求对象 SearchRequest request = new SearchRequest("indexName", "query"); // 创建聚合器 SearchSourceBuilder builder = new SearchSourceBuilder(); builder.aggregation(AggregationBuilders.extendedStats("field_name")); // 设置聚合器 request.source(builder); // 执行搜索 SearchResponse response = client.search(request, RequestOptions.DEFAULT); // 获取搜索结果 ExtendedStats agg = response.getAggregations().get("agg"); // 打印最大值、最小值、平均值等 System.out.println(agg.getMax()); System.out.println(agg.getMin()); System.out.println(agg.getAverage()); ``` **其他功能** * **分词词语搜索**:使用 `terms` 或 `multi_terms` 关键字搜索分词词语。 * **忽略分词符号**:可以使用 `analyzer` 设置分词符号,例如 `standard` 或 `snowball`。 * **自定义聚合器**:您可以自定义聚合器以处理特定需求。

正文

目录

ElasticSearch 实现分词全文检索 - 概述
ElasticSearch 实现分词全文检索 - ES、Kibana、IK安装
ElasticSearch 实现分词全文检索 - Restful基本操作
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 索引操作
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 文档操作
ElasticSearch 实现分词全文检索 - 测试数据准备
ElasticSearch 实现分词全文检索 - term、terms查询
ElasticSearch 实现分词全文检索 - match、match_all、multimatch查询
ElasticSearch 实现分词全文检索 - id、ids、prefix、fuzzy、wildcard、range、regexp 查询
ElasticSearch 实现分词全文检索 - Scroll 深分页
ElasticSearch 实现分词全文检索 - delete-by-query
ElasticSearch 实现分词全文检索 - 复合查询
ElasticSearch 实现分词全文检索 - filter查询
ElasticSearch 实现分词全文检索 - 高亮查询
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
ElasticSearch 实现分词全文检索 - 经纬度查询
ElasticSearch 实现分词全文检索 - 搜素关键字自动补全(suggest)
ElasticSearch 实现分词全文检索 - SpringBoot 完整实现 Demo 附源码

数据准备

ElasticSearch 实现分词全文检索 - 测试数据准备

聚合查询

ES 的聚合查询和MySQL的聚合查询类型,ES的聚合查询相比MySQL要强大,提供的统计数据的方式多种多样

# ES聚合查询的 Restful 语法
POST /index/type/_search
{
   "aggs":{
       "名字(agg)":{
            "agg_type":{
               "属性":"值"
            }
       }
   }
}

去重计数查询 (Cardinality)

去重计数,即 Cardinality,第一步先将返回的文档中的一个指定的field进行去重,统计一共有多少条

#去重计数
POST /sms-logs-index/_search
{
  "aggs": {
    "agg": {
      "cardinality": {
        "field": "province"
      }
    }
  }
}

Java

@Test
void cardinalityQuery() throws Exception {
    String indexName = "sms-logs-index";
    RestHighLevelClient client = ESClient.getClient();

    //1. 创建SearchRequest对象
    SearchRequest request = new SearchRequest(indexName);

    //2. 指定查询条件
    SearchSourceBuilder builder = new SearchSourceBuilder();
    builder.aggregation(AggregationBuilders.cardinality("agg").field("province"));

    request.source(builder);

    //3. 执行查询
    SearchResponse resp = client.search(request, RequestOptions.DEFAULT);

    //4. 输出返回值
    Cardinality agg = resp.getAggregations().get("agg");
    long value = agg.getValue();
    System.out.println(value);
}

范围统计 (range)

统计一定范围内出现的文档个数,比如:针对某一个Field的值在 0100,100200,200~300 之间文档出现的个数分别是多少
范围统计可以针对普通的数值,针对时间类型,针对IP类型,都可以做相应的统计。
range,data_range,ip_range

# 数值方式范围统计
POST /sms-logs-index/_search
{
  "aggs": {
    "agg": {
      "range": {
        "field": "fee",
        "ranges": [
          {
            "to": 20
          },
          {
            "from": 20, # from 有包含当前值的意思
            "to": 30
          },
          {
            "from": 30
          }
        ]
      }
    }
  }
}

# 数值方式范围统计
POST /sms-logs-index/_search
{
  "aggs": {
    "agg": {
      "date_range": {
        "field": "createDate",
        "format":"yyyy",
        "ranges": [
          {
            "to": 2023  # 2023以前的数据量
          }, 
          {
            "from": 2023 # 2023以后的数据量
          }
        ]
      }
    }
  }
}

# IP方式范围统计
POST /sms-logs-index/_search
{
  "aggs": {
    "agg": {
      "ip_range": {
        "field": "ipAddr",
        "ranges": [
          {
            "to": "172.16.0.4"
          }, 
          {
            "from": "172.16.0.4"
          }
        ]
      }
    }
  }
}

Java

@Test
void rangeQuery() throws Exception {
    String indexName = "sms-logs-index";
    RestHighLevelClient client = ESClient.getClient();

    //1. 创建SearchRequest对象
    SearchRequest request = new SearchRequest(indexName);

    //2. 指定查询条件
    SearchSourceBuilder builder = new SearchSourceBuilder();
    builder.aggregation(AggregationBuilders.range("agg").field("fee")
            .addUnboundedTo(20)
            .addRange(20, 30)
            .addUnboundedFrom(30));

    request.source(builder);

    //3. 执行查询
    SearchResponse resp = client.search(request, RequestOptions.DEFAULT);

    //4. 输出返回值
    org.elasticsearch.search.aggregations.bucket.range.Range agg = resp.getAggregations().get("agg");
    for (Range.Bucket bucket : agg.getBuckets()) {
        String key = bucket.getKeyAsString();
        Object from = bucket.getFrom();
        Object to = bucket.getTo();
        long docCount = bucket.getDocCount();
        System.out.println(String.format("Key:%s From: %s  to: %s DocCount: %s", key, from, to, docCount));
    }
}

统计聚合查询 (extended_stats)

他可以查询指定Field的最大值,最小值,平均值,平方和...

# 统计聚合查询
POST /sms-logs-index/_search
{
  "aggs": {
    "agg": {
      "extended_stats": {
        "field": "fee"
      }
    }
  }
}

返回值

"aggregations" : {
    "agg" : {
      "count" : 8,
      "min" : 17.0,
      "max" : 45.0,
      "avg" : 31.25,
      "sum" : 250.0,
      "sum_of_squares" : 8468.0,
      "variance" : 81.9375,
      "variance_population" : 81.9375,
      "variance_sampling" : 93.64285714285714,
      "std_deviation" : 9.051933495115836,
      "std_deviation_population" : 9.051933495115836,
      "std_deviation_sampling" : 9.676923950453322,
      "std_deviation_bounds" : {
        "upper" : 49.35386699023167,
        "lower" : 13.146133009768327,
        "upper_population" : 49.35386699023167,
        "lower_population" : 13.146133009768327,
        "upper_sampling" : 50.60384790090664,
        "lower_sampling" : 11.896152099093356
      }
    }
  }

Java

@Test
void extendedQuery() throws Exception {
    String indexName = "sms-logs-index";
    RestHighLevelClient client = ESClient.getClient();

    //1. 创建SearchRequest对象
    SearchRequest request = new SearchRequest(indexName);

    //2. 指定查询条件
    SearchSourceBuilder builder = new SearchSourceBuilder();
    builder.aggregation(AggregationBuilders.extendedStats("agg").field("fee"));
    request.source(builder);

    //3. 执行查询
    SearchResponse resp = client.search(request, RequestOptions.DEFAULT);

    //4. 输出返回值
    ExtendedStats agg = resp.getAggregations().get("agg");
    double max = agg.getMax();
    double min = agg.getMin();
    System.out.println(String.format("Max:%s Min: %s ", max, min));
}

官方文档:https://www.elastic.co/guide/cn/elasticsearch/reference/index.html

与ElasticSearch 实现分词全文检索 - 聚合查询 cardinality相似的内容:

ElasticSearch 实现分词全文检索 - 聚合查询 cardinality

目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES、Kibana、IK安装 ElasticSearch 实现分词全文检索 - Restful基本操作 ElasticSearch 实现分词全文检索 - Java SpringBoot E

ElasticSearch 实现分词全文检索 - 概述

ES 是一个使用Java语言并且基于Lucene编写的搜索引擎框架,他提供了分布式的全文搜索功能,提供了一个统一的基于Restful风格的WEB接口,官方客户端也对多种语言都提供了相应的API。

ElasticSearch 实现分词全文检索 - ES、Kibana、IK分词器安装

先把zip下载下来。放到任意一台服务器(直接github上下载多数会失败)elasticsearch-plugin install http://172.16.0.183:8899/Java/elasticsearch-analysis-ik-7.9.3.zip

ElasticSearch 实现分词全文检索 - Restful基本操作

GET 请求: ``` http://ip:port/index: 查询索引信息 http://ip;port/index/type/doc_id: 查询指定的文档信息 ``` POST 请求: ``` http://ip;port/index/type/_search: 查询文档,可以在请求体中添加json字符串来代表查询条件 http://ip;port/index/type/doc_id/

ElasticSearch 实现分词全文检索 - Java SpringBoot ES 索引操作

//1. 准备索引的 settings Settings.Builder settings = Settings.builder() //2. 准备索引的结构 Mappings XContentBuilder mappings = JsonXContent.contentBuilder() //3. 将 Settings 和 Mappings 封装到一个Request 对象中

ElasticSearch 实现分词全文检索 - Java SpringBoot ES 文档操作

//准备一个Request对象 IndexRequest request = new IndexRequest(indexName); request.id(person.getId().toString()); //手动指定ID request.source(personJson, XContentType.JSON); //通过 Client 对象执行

ElasticSearch 实现分词全文检索 - 测试数据准备

String json = JSON.toJSONStringWithDateFormat(sms, "yyyy-MM-dd HH:mm:ss"); FastJson 将日期格式化 BulkRequest bulkRequest = new BulkRequest(); Integer idx = 1; for (String json : jsonList) {

ElasticSearch 实现分词全文检索 - term、terms查询

term 查询 term的查询是代表完全匹配,搜索之前不会对你搜索的关键字进行分词,对你的关键字去文档分词库中的去匹配内容 terms和term的查询机制是一样,都不会将指定的查询关键字进行分词,直接去分词库中匹配,找到相应文档内容。 terms是在针对一个字段包含多个值的时候使用。 term: where province = 江苏 terms: where province = 江苏 or p

ElasticSearch 实现分词全文检索 - match、match_all、multimatch查询

match查询属于高层查询,他会根据你查询的字段类型不一样,采用不同的查询方式。 - 查询的是日期或者是数值的话,他会将你基于的字符串查询内容转换为日期或者数值对待。 - 如果查询的内容是一个不能被分词的内容 (keyword) ,match查询不会对你指定的查询关键字进行分词。 - 如果查询的内容时一个可以被分词的内容 (text),match会将你指定的查询内容根据一定的方式去分词,去分词库中

ElasticSearch 实现分词全文检索 - id、ids、prefix、fuzzy、wildcard、range、regexp 查询

fuzzy查询:模糊查询,我们输入字符的大概,ES就可以 wildcard 查询:通配查询,和MySQL中的 like 差不多,可以在查询时,在字符串中指定通配符 * 和占位符? range 查询:范围查询,只针对数值类型,对某一个Field进行大于或小于的范围指定查询 regexp 查询: 正则查询,通过你编写的正则表达式去匹配内容