36-天亮大数据系列教程之ElasticSearch6系列最新版教程之java操作es-3

目录
1、文档检索与排序
2、文档聚合操作

详情

1、文档检索与排序

  • 检索分类
    • 结构化检索
      • 针对字段类型: 日期、时间、数字类型,以及精确的文本匹配。
        • 1)结构化查询,我们得到的结果 总是 非是即否,要么存于集合之中,要么存在集合之外。
          • 2)结构化查询不关心文件的相关度或评分;它简单的对文档包括或排除处理。
          • 全文检索
          • 全文检索通常用于在全文本字段(如电子邮件正文,网页正文,标题)上运行全文查询。
          • 目标字段要提前进行索引分词等处理,亦可在搜索前对输入进行搜索分词操作,还可以增加逻辑关系、匹配度打分过滤等因子,辅助更灵活的全文检索要求。
          • 一般是会根据类TF/IDF算法,对搜索出来的文档进行打分操作。
          • TF/IDF算法
            • 一种用于信息检索与数据挖掘的常用加权技术,打分公式类似于: score=TF * IDF
            • TF意思是词频(Term Frequency),IDF意思是逆文本频率指数(Inverse Document Frequency)。
            • 核心思想: 如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
          • 复合检索、GEO等其它类检索
          • 后续在实战使用当中,进一步扩展与深化。
    • 常用检索类型说明
      • term检索:对输入的搜索词不进行分词处理,直接作为一个term去目标字段中匹配是否存在相同的term。
      • query_string检索:对输入的搜索词进行搜索分词处理后得到1或多个term,并将这些term去目标字段中匹配,是否存在相同的term,并按照类TF/IDF算法对命中结果打分与排序计算。
      • wildcard检索:模糊查询,对输入的搜索词不进行分词处理,直接与目标字段中的term集合进行模糊匹配,支持*,?等正则表达式语法。
      • range检索:范围检索,主要是针对数值、日期类型字段进行操作。
      • missing检索:判断某个type是否存在某个field字段,若存在则返回False,不存在则返回True。
    • 常用检索需求
      • 1、在索引index_from_tc,类型type_from_tc的title字段中,term搜索“中国”的结果集的top20(默认是top10)。
/**
   * term匹配搜索指定关键词
   *
   * @param indexName
   * @param typeName
   */
  public void searchByTermQuery(String indexName, String typeName) {
    // 构造query
    TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title",
         "中国");
    // 将数据发送到服务器端
    SearchResponse response = this.client.prepareSearch(indexName)
         .setTypes(typeName).setQuery(termQueryBuilder).setFrom(0)
         .setSize(20).execute().actionGet();
    SearchHits hits = response.getHits();
    for (SearchHit searchHit : hits) {
       Map source = searchHit.getSourceAsMap();
       System.out.println(source);
    }
  }
public static void main(String[] args) throws IOException {
    // 初始化client工具类
    TransportClientUtil transportClient = new TransportClientUtil();
    // 创建索引
    String indexName = "index_from_tc";
    String typeName = "type_from_tc";
    transportClient.searchByTermQuery(indexName, typeName);
    System.out.println("done");
}

2、在索引index_from_tc,类型type_from_tc的title字段中,term搜索“中国”的结果集中,按发布时间排序后的top20。

/**
   * 通过term string来搜索后,按某字段排序
   *
   * @param indexName
   * @param typeName
   */
  public void searchByTermQueryWithSort(String indexName, String typeName) {
    // 构造query
    TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title",
         "中国");
    // 将数据发送到服务器端
    SearchResponse response = this.client.prepareSearch(indexName)
         .setTypes(typeName).setQuery(termQueryBuilder)
         .addSort("post_time", SortOrder.DESC).setFrom(0).setSize(20)
         .execute().actionGet();
    SearchHits hits = response.getHits();
    for (SearchHit searchHit : hits) {
       Map source = searchHit.getSourceAsMap();
       System.out.println(source);
    }
  }

public static void main(String[] args) throws IOException {
    // 初始化client工具类
    TransportClientUtil transportClient = new TransportClientUtil();
    // 创建索引
    String indexName = "index_from_tc";
    String typeName = "type_from_tc";
    transportClient.searchByTermQueryWithSort(indexName, typeName);
    System.out.println("done");
  }

2、文档聚合操作

  • 聚合含义(aggregation)
    • 对搜索结果进行统计分析,如按日期分组统计、求最大值、最小值等
      • 同时可以获取明细信息
    • 常见聚合需求
      • 1、求所爬取新闻列表数据中,标题命中”中国”新闻中,最新的发布日期
/**
   * 获取指定索引和类型下,最新的发布时间
   *
   * @param indexName
   * @param typeName
   */
  public void searchMaxPostTimeItem(String indexName, String typeName) {
    // 构造query
    TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title",
         "中国");
    // 将数据发送到服务器端
    SearchResponse response = this.client
         .prepareSearch(indexName)
         .setTypes(typeName)
         .setQuery(termQueryBuilder)
         .addSort("post_time", SortOrder.DESC)
         .setFrom(0)
         .setSize(20)
         .addAggregation(
             AggregationBuilders.max("max_post_time").field(
                 "post_time")).execute().actionGet();
    SearchHits hits = response.getHits();
    for (SearchHit searchHit : hits) {
       Map source = searchHit.getSourceAsMap();
       System.out.println(source);
    }
    Aggregations aggregations = response.getAggregations();
    System.out.println(aggregations.getAsMap());
  }

public static void main(String[] args) throws IOException {
    // 初始化client工具类
    TransportClientUtil transportClient = new TransportClientUtil();
    // 创建索引
    String indexName = "index_from_tc";
    String typeName = "type_from_tc";
    transportClient.searchMaxPostTimeItem(indexName, typeName);
    System.out.println("done");
  }

2、求所爬取新闻列表数据中,标题命中”中国”新闻中,最大和最小(旧)的发布日期

/**
   * 获取指定索引和类型下,同时获取最新和最旧的的发布时间
   *
   * @param indexName
   * @param typeName
   */
  public void searchMaxAndMinPostTimeItem(String indexName, String typeName) {
    // 构造query
    TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title",
         "中国");
    // 将数据发送到服务器端
    SearchResponse response = this.client
         .prepareSearch(indexName)
         .setTypes(typeName)
         .setQuery(termQueryBuilder)
         .addSort("post_time", SortOrder.DESC)
         .setFrom(0)
         .setSize(20)
         .addAggregation(
             AggregationBuilders.max("max_post_time").field(
                 "post_time"))
         .addAggregation(
             AggregationBuilders.min("min_post_time").field(
                 "post_time")).execute().actionGet();
    SearchHits hits = response.getHits();
    for (SearchHit searchHit : hits) {
       Map source = searchHit.getSourceAsMap();
       System.out.println(source);
    }
    Aggregations aggregations = response.getAggregations();
    System.out.println(aggregations.getAsMap());
  }
public static void main(String[] args) throws IOException {
    // 初始化client工具类
    TransportClientUtil transportClient = new TransportClientUtil();
    // 创建索引
    String indexName = "index_from_tc";
    String typeName = "type_from_tc";
    transportClient.searchMaxAndMinPostTimeItem(indexName, typeName);
    System.out.println("done");
  }
  • 3、求所爬取新闻列表数据中,对应的发布时间分布
 public void searchPosttimeDist4History(String indexName, String typeName) {
    AggregationBuilder aggregation = AggregationBuilders
         .dateHistogram("agg").field("post_time").format("yyyy-MM-dd")
         .dateHistogramInterval(DateHistogramInterval.DAY);
    // 将数据发送到服务器端
    SearchResponse response = this.client.prepareSearch(indexName)
         .setTypes(typeName).setQuery(QueryBuilders.matchAllQuery())
         .addSort("post_time", SortOrder.DESC).setFrom(0).setSize(0)
         .addAggregation(aggregation).execute().actionGet();
    SearchHits hits = response.getHits();
    for (SearchHit searchHit : hits) {
       Map source = searchHit.getSourceAsMap();
       System.out.println(source);
    }
    Aggregations aggregations = response.getAggregations();
    System.out.println(aggregations.getAsMap());
  }
  public static void main(String[] args) throws IOException {
    // 初始化client工具类
    TransportClientUtil transportClient = new TransportClientUtil();
    // 创建索引
    String indexName = "index_from_tc";
    String typeName = "type_from_tc";
    transportClient.searchPosttimeDist4History(indexName, typeName);
    System.out.println("done");
  }


天亮教育是一家从事大数据云计算、人工智能、教育培训、产品开发、咨询服务、人才优选为一体的综合型互联网科技公司。
公司由一批BAT等一线互联网IT精英人士创建,
以”快乐工作,认真生活,打造高端职业技能教育的一面旗帜”为愿景,胸怀”让天下没有难找的工作”使命,
坚持”客户第一、诚信、激情、拥抱变化”的价值观,
全心全意为学员赋能提效,践行技术改变命运的初心。

更多学习讨论, 请加入
官方-天亮大数据交流-366784928
群二维码:
这里写图片描述
天亮教育公开课-从小白到大佬修成记-全系列视频地址:http://bbs.myhope365.com/forum.php?mod=viewthread&tid=1422&extra=page%3D1

欢迎关注天亮教育公众号,大数据技术资料与课程、招生就业动态、教育资讯动态、创业历程分享一站式分享,官方微信公众号二维码:
这里写图片描述

天亮教育官方群318971238,
爬虫、nlp技术qq群320349384
hadoop & spark & hive技术群297585251,
官网:http://myhope365.com
官方天亮论坛:http://bbs.myhope365.com/

猜你喜欢

转载自blog.csdn.net/erliang20088/article/details/81663840