• ES优化实战-通过开启copy_to提升一倍的检索性能


      在对text字段进行搜索的时候,假如你需要对多个text类型的字段搜索,例如 文章的标题和文章的内容,这两个字段。

      在这种情况下,是可以开启copy_to来提速的。我测试的提速效果在百分之五十左右。

      它是将这两个字段copy到一个字段上,然后进行分词处理。之所以会快,就是因为如果你多个字段,要做多次的查询,如果合并到一个字段上,只需要做一次查询。

      但是请注意,它会额外花费比较多的磁盘资源!

    测试结论

    对两个text类型字段检索,数据内容为文章和标题。开启copy_to以后,搜索提升百分之五十左右。磁盘额外占用百分之二十五左右。

    如何开启copy_to

    我这里不做过多的介绍了,直接看官网吧。

    copy_to | Elasticsearch Guide [8.4] | Elastic

    看看资源花费情况

     GET _cat/indices?v

    可以看到索引在开启copy_to前是583G,开启后是724G。磁盘多花费了24%。这个要根据自己数据情况,具体去测试分析。因为大家的数据,场景都不一样。

     看看提升效果

      我是写测试程序跑了几百个搜索词条件,做测试。搜索就是query_string,然后mache_phrase

      测试代码如下: 

    1. @Override
    2. public void comparisonCopyTo() throws IOException {
    3. // 搜索词
    4. List queryList = Arrays.asList("中国", "美国", "拜登", "疫情", "苹果", "华为", "特朗普", "利好", "浪漫", "马斯特",
    5. "特斯拉", "台湾", "香港", "美食", "微信", "晴天", "北京", "救援", "失败", "报警",
    6. "媒体", "新疆", "京东", "深圳", "爆炸", "事故", "征地", "抗议", "聚众", "黑社会",
    7. "堵路", "打砸", "罢工", "跳楼", "招募", "黑旅馆", "争议", "盗窃", "碰车", "示威",
    8. "不满", "黑中介", "失火", "举报", "公道", "经济学家", "中国新闻周刊", "永定河", "中国大地财产保险股份有限公司", "冬奧",
    9. "天津大事件");
    10. // 对比逻辑:相同的搜索词,去对比搜索时间,打印日志,校验搜索结果
    11. for (String queryString:queryList) {
    12. HashMap fields = new HashMap<>();
    13. fields.put("content", 1.0F);
    14. fields.put("title", 1.0F);
    15. QueryStringQueryBuilder queryBuilder = QueryBuilders.queryStringQuery(queryString).fields(fields).type(MultiMatchQueryBuilder.Type.PHRASE);
    16. SearchResponse data = commonsDao.basicSearch(queryBuilder, 10, true, "all_data");
    17. // 查询copy-to的字段
    18. HashMap copyToFields = new HashMap<>();
    19. copyToFields.put("full_search", 1.0F);
    20. QueryStringQueryBuilder copyToQueryBuilder = QueryBuilders.queryStringQuery(queryString).fields(copyToFields).type(MultiMatchQueryBuilder.Type.PHRASE);
    21. SearchResponse copyToData = commonsDao.basicSearch(copyToQueryBuilder, 10, true, "all_data_copy_to");
    22. log.info("copy-to测试对比(un copy-to vs copy-to), 搜索词 {},查询时间对比 {} vs {}, 查询性能提升 {}% ,查询结果对比 {} vs {}", queryString,
    23. data.getTook().getMillis(), copyToData.getTook().getMillis(), (float)(data.getTook().getMillis() - copyToData.getTook().getMillis())/data.getTook().getMillis()*100,
    24. data.getHits().getTotalHits().value, copyToData.getHits().getTotalHits().value);
    25. }
    26. }

    测试结果如下:

  • 相关阅读:
    Win11系统软件提示端口被占用无法使用解决方法
    黑客(网络安全)技术自学30天
    教育直播APP开发
    mysql优化之explain 以及 索引优化
    Charles如何抓取https请求-移动端+PC端
    【数据分享】2023年我国省市县三级的独角兽企业数量(Excel/Shp格式)
    Linux 指令学习
    使用 ORM 与原始 SQL 的性能对比
    面试题七:Vue.set()的使用
    Redis 6.0源码学习 RedisObject
  • 原文地址:https://blog.csdn.net/star1210644725/article/details/127036634