Elasticsearch使用msearch提高聚合效率(与search检索对比)

这篇具有很好参考价值的文章主要介绍了Elasticsearch使用msearch提高聚合效率(与search检索对比)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

描述

数据量共约3000万+,在使用es进行term聚合的时候,发现执行耗费时间巨大,因此采用了msearch的检索方式

多搜索接口编辑 多搜索 API 从单个 API 请求执行多个搜索。 请求的格式类似于批量 API 格式,并使用 换行符分隔的 JSON (NDJSON) 格式。
结构类型于下

GET my-index-000001/_msearch
{ }
{"query" : {"match" : { "message": "this is a test"}}}
{"index": "my-index-000002"}
{"query" : {"match_all" : {}}}

kibana查询操作

使用kibana进行msearch操作

POST cqu_dev_journal_paper/_msearch
{"index":["cqu_dev_journal_paper"],"types":[],"search_type":"dfs_query_then_fetch","ccs_minimize_roundtrips":true}
{"from":10,"size":10,"query":{"bool":{"must":[{"exists":{"field":"title","boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}},"version":true,"explain":false,"_source":{"includes":["id","sid","title","author","journalId","journalVolumeId","publisherName","doi","pageInfo"],"excludes":[]},"sort":[{"createTime":{"order":"desc"}}],"track_total_hits":2147483647}
{"index":["cqu_dev_journal_paper"],"types":[],"search_type":"query_then_fetch","ccs_minimize_roundtrips":true}
{"from":0,"size":1,"query":{"bool":{"must":[{"exists":{"field":"title","boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}},"version":true,"explain":false,"_source":{"includes":["id"],"excludes":[]},"aggregations":{"year":{"terms":{"field":"year","size":50,"min_doc_count":1,"shard_min_doc_count":0,"show_term_doc_count_error":false,"order":[{"_count":"desc"},{"_key":"asc"}],"collect_mode":"breadth_first"}}}}
{"index":["cqu_dev_journal_paper"],"types":[],"search_type":"query_then_fetch","ccs_minimize_roundtrips":true}
{"from":0,"size":1,"query":{"bool":{"must":[{"exists":{"field":"title","boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}},"version":true,"explain":false,"_source":{"includes":["id"],"excludes":[]},"aggregations":{"subject":{"terms":{"field":"subject","size":50,"min_doc_count":1,"shard_min_doc_count":0,"show_term_doc_count_error":false,"order":[{"_count":"desc"},{"_key":"asc"}],"collect_mode":"breadth_first"}}}}
{"index":["cqu_dev_journal_paper"],"types":[],"search_type":"query_then_fetch","ccs_minimize_roundtrips":true}
{"from":0,"size":1,"query":{"bool":{"must":[{"exists":{"field":"title","boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}},"version":true,"explain":false,"_source":{"includes":["id"],"excludes":[]},"aggregations":{"publisherName":{"terms":{"field":"publisherName.raw","size":50,"min_doc_count":1,"shard_min_doc_count":0,"show_term_doc_count_error":false,"order":[{"_count":"desc"},{"_key":"asc"}],"collect_mode":"breadth_first"}}}}
{"index":["cqu_dev_journal_paper"],"types":[],"search_type":"query_then_fetch","ccs_minimize_roundtrips":true}
{"from":0,"size":1,"query":{"bool":{"must":[{"exists":{"field":"title","boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}},"version":true,"explain":false,"_source":{"includes":["id"],"excludes":[]},"aggregations":{"journalId":{"terms":{"field":"journalId","size":50,"min_doc_count":1,"shard_min_doc_count":0,"show_term_doc_count_error":false,"order":[{"_count":"desc"},{"_key":"asc"}],"collect_mode":"breadth_first"}}}}
{"index":["cqu_dev_journal_paper"],"types":[],"search_type":"query_then_fetch","ccs_minimize_roundtrips":true}
{"from":0,"size":1,"query":{"bool":{"must":[{"exists":{"field":"title","boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}},"version":true,"explain":false,"_source":{"includes":["id"],"excludes":[]},"aggregations":{"publishCountry":{"terms":{"field":"publishCountry.raw","size":50,"min_doc_count":1,"shard_min_doc_count":0,"show_term_doc_count_error":false,"order":[{"_count":"desc"},{"_key":"asc"}],"collect_mode":"breadth_first"}}}}
{"index":["cqu_dev_journal_paper"],"types":[],"search_type":"query_then_fetch","ccs_minimize_roundtrips":true}
{"from":0,"size":1,"query":{"bool":{"must":[{"exists":{"field":"title","boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}},"version":true,"explain":false,"_source":{"includes":["id"],"excludes":[]},"aggregations":{"language":{"terms":{"field":"language.raw","size":50,"min_doc_count":1,"shard_min_doc_count":0,"show_term_doc_count_error":false,"order":[{"_count":"desc"},{"_key":"asc"}],"collect_mode":"breadth_first"}}}}


语句解析

msearch查询的数据结构如下,

header\n
body\n
header\n
body\n

因此下面语句中第一个json就是header,第二个是请求的body,

{"index":["cqu_dev_journal_paper"],"types":[],"search_type":"dfs_query_then_fetch","ccs_minimize_roundtrips":true}
{"from":10,"size":10,"query":{"bool":{"must":[{"exists":{"field":"title","boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}},"version":true,"explain":false,"_source":{"includes":["id","sid","title","author","journalId","journalVolumeId","publisherName","doi","pageInfo"],"excludes":[]},"sort":[{"createTime":{"order":"desc"}}],"track_total_hits":2147483647}

官网对于请求的说明:
地址: es 多搜索接口

请求正文包含以换行符分隔的搜索列表和 搜索对象。
<header> (必填,对象) 用于限制或更改搜索的参数。
此对象对于每个搜索正文都是必需的,但可以为空 () 或空白 线。{} 

 <body>
(可选,对象) 包含搜索请求的参数:

对象的属性<body>
aggregations
(可选,聚合对象) 您希望在搜索期间运行的聚合。请参阅聚合。
query
(可选,查询 DSL 对象)您希望在 搜索。响应中将返回与此查询匹配的命中。
from
(可选,整数) 返回命中的起始偏移量。默认值为 。0
size
(可选,整数) 要返回的命中数。默认值为 。10

代码操作验证对比

使用SpringDataElaticsearch进行对es检索的操作,代码如下:

MultiSearch 检索

  //MultiSearch 查询
        List<Query> queryList = new ArrayList<>();

        NativeSearchQueryBuilder listNativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        //返回数据总数量
        listNativeSearchQueryBuilder.withTrackTotalHits(true);
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(QueryBuilders.existsQuery("title"));

        //设置检索词和聚合项的查询条件
        listNativeSearchQueryBuilder.withQuery(boolQueryBuilder);

        //构造分页排序
        Pageable pageable = PageRequest.of(1, 10, Sort.by(Sort.Direction.DESC, "createTime"));
        listNativeSearchQueryBuilder.withPageable(pageable);

        //设置返回字段
        listNativeSearchQueryBuilder.withFields("id", "sid", "title", "author", "journalId", "journalVolumeId", "publisherName", "doi", "pageInfo");

        //列表查询的query放入查询列表
        queryList.add(listNativeSearchQueryBuilder.build());

        HashMap<String, String> aggFieldMap = new HashMap<>();
        aggFieldMap.put("subject", "subject");
        aggFieldMap.put("year", "year");
        aggFieldMap.put("journalId", "journalId");
        aggFieldMap.put("publisherName", "publisherName.raw");
        aggFieldMap.put("language", "language.raw");
        aggFieldMap.put("publishCountry", "publishCountry.raw");

        NativeSearchQueryBuilder aggNativeSearchQueryBuilder;
        for (String name : aggFieldMap.keySet()) {
            aggNativeSearchQueryBuilder = new NativeSearchQueryBuilder();
            aggNativeSearchQueryBuilder.withQuery(boolQueryBuilder);
            //表示不返回列表数据
            aggNativeSearchQueryBuilder.withPageable(PageRequest.of(0, 1));
            aggNativeSearchQueryBuilder.withSearchType(SearchType.QUERY_THEN_FETCH);
            aggNativeSearchQueryBuilder.withFields("id");
            aggNativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms(name).field(aggFieldMap.get(name))
                    .collectMode(Aggregator.SubAggCollectionMode.BREADTH_FIRST).size(50));
            queryList.add(aggNativeSearchQueryBuilder.build());
        }

        long  pageStart = System.currentTimeMillis();
        //multiSearch:允许在一次请求中执行多个查询操作,并将查询结果一起返回
        List<SearchHits<JournalPaperEsBean>> searchHitsList = elasticsearchOperations.multiSearch(queryList, JournalPaperEsBean.class);
        System.out.println("==========es agg search:" + (System.currentTimeMillis() - pageStart));

    }

执行耗费时间:3723ms

search检索

@Test
    void test() {
        //search 查询
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        //返回数据总数量
        nativeSearchQueryBuilder.withTrackTotalHits(true);
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(QueryBuilders.existsQuery("title"));

        //设置检索词和聚合项的查询条件
        nativeSearchQueryBuilder.withQuery(boolQueryBuilder);

        //构造分页排序
        Pageable pageable = PageRequest.of(1, 10, Sort.by(Sort.Direction.DESC, "createTime"));
        nativeSearchQueryBuilder.withPageable(pageable);

        nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("subject").field("subject").size(50));
        nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("year").field("year").size(50).order(BucketOrder.key(false)));
        nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("journalId").field("journalId").size(50));
        nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("publisherName").field("publisherName.raw").size(50));
        nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("language").field("language.raw").size(50));
        nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("publishCountry").field("publishCountry.raw").size(50));

        //设置返回字段
        nativeSearchQueryBuilder.withFields("id", "sid", "title", "author", "journalId", "journalVolumeId", "publisherName", "doi", "pageInfo");

        long start = System.currentTimeMillis();
        //执行检索操作
        SearchHits<JournalPaperEsBean> searchHits = elasticsearchOperations.search(nativeSearchQueryBuilder.build(), JournalPaperEsBean.class);

        System.out.println("=====agg:" + (System.currentTimeMillis() - start));
    }

耗时:15298ms

对比可以发现:使用msearch比search效率提高了近5倍!文章来源地址https://www.toymoban.com/news/detail-521961.html

到了这里,关于Elasticsearch使用msearch提高聚合效率(与search检索对比)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Elasticsearch专栏 03】深入探索:Elasticsearch的倒排索引是如何提高搜索效率的?

    倒排索引之所以能够提高搜索效率,关键在于其独特的构建方式和数据结构设计。下面,我将对倒排索引的工作原理进行深层解读,并阐述其如何显著提高搜索效率。 分词与索引构建 首先,搜索引擎会对文档内容进行分词处理,将文本拆分成独立的单词或词组。然后,为每

    2024年02月22日
    浏览(29)
  • ElasticSearch基础3——聚合、补全、集群。黑马旅游检索高亮+自定义分词器+自动补全+前后端消息同步

    导航: 【黑马Java笔记+踩坑汇总】JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud/SpringCloudAlibaba+黑马旅游+谷粒商城  黑马旅游源码:  GitHub: GitHub - vincewm/hotel: 黑马旅游项目 Gitee: hotel: 黑马旅游项目 目录 1.数据聚合 1.1.聚合的种类 1.2.DSL实现聚合 1.2.1.Bucket聚合语法 1.2.2.聚合结果

    2023年04月16日
    浏览(68)
  • 互联网大厂技术-elasticsearch(es)- 在数据量很大的情况下(数十亿级别)提高查询效率

    互联网大厂技术-elasticsearch(es)- 在数据量很大的情况下(数十亿级别)提高查询效率 目录 一、问题分析 二、问题剖析 三、性能优化的杀手锏(filesystem cache) 四、数据预热 五、冷热分离 六、document 模型设计 七、分页性能优化 八、解决方案 这个问题是肯定要问的,说白了,就

    2024年02月04日
    浏览(65)
  • 【高级RAG技巧】使用二阶段检索器平衡检索的效率和精度

    之前的文章已经介绍过向量数据库在RAG(Retrieval Augmented Generative)中的应用,本文将会讨论另一个重要的工具-Embedding模型。 一般来说,构建生产环境下的RAG系统是直接使用Embedding模型对用户输入的Query进行向量化表示,并且从已经构建好的向量数据库中检索出相关的段落用户

    2024年04月26日
    浏览(29)
  • 医生如何使用ChatGPT提高工作效率

    ✍创作者:全栈弄潮儿 🏡 个人主页: 全栈弄潮儿的个人主页 🏙️ 个人社区,欢迎你的加入:

    2024年02月11日
    浏览(46)
  • 客服如何使用ChatGPT提高工作效率

    ✍创作者:全栈弄潮儿 🏡 个人主页: 全栈弄潮儿的个人主页 🏙️ 个人社区,欢迎你的加入:

    2024年02月11日
    浏览(56)
  • 程序员如何使用chatgpt提高工作效率

    公众号对话chatgpt 网页在线对话 ● 拥有一个 OpenAI 账号(需要梯子)。 ● 账号申请访问地址:https://platform.openai.com/。 ● ChatGPT 对话地址:https://chat.openai.com/chat。 API接入 ● 需要一个 API key(依赖于 OpenAI 账号)。 ● 普通的 HTTP 请求即可接入,参考文档:https://platform.opena

    2024年02月08日
    浏览(48)
  • 使用多线程或异步技术提高图片抓取效率

    图片抓取是爬虫技术中常见的需求,但是图片抓取的效率受到很多因素的影响,比如网速、网站反爬机制、图片数量和大小等。本文将介绍如何使用多线程或异步技术来提高图片抓取的效率,以及如何使用爬虫代理IP来避免被网站封禁。 多线程和异步技术都是利用计算机的并

    2024年02月09日
    浏览(31)
  • 如何优雅地使用Low Code提高开发效率

    2023年,低代码热度有,但是在企业内部核心场景的落地比例不高,推进进展也没有想象中快。就算是这样,低代码赛道也在“暗流涌动”。 数字化趋势下,很多企业想要以数字化的手段进行降本增效 。很多企业希望以低代码的模式,搭建符合自身业务需求的应用。 现在国内

    2024年02月09日
    浏览(54)
  • Java并发(二)----初次使用多线程并行提高效率

    并行代表充分利用多核 cpu 的优势,提高运行效率。 想象下面的场景,执行 3 个计算,最后将计算结果汇总。 如果是串行执行,那么总共花费的时间是 10 + 11 + 9 + 1 = 31ms 但如果是四核 cpu,各个核心分别使用线程 1 执行计算 1,线程 2 执行计算 2,线程 3 执行计算 3,那么 3 个

    2023年04月13日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包