您当前的位置: 首页 > 

水的精神

暂无认证

  • 8浏览

    0关注

    711博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

水的精神 发布时间:2022-09-25 13:06:36 ,浏览量:8

  在对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

  测试代码如下: 

    @Override
    public void comparisonCopyTo() throws IOException {
        // 搜索词
        List queryList = Arrays.asList("中国", "美国", "拜登", "疫情", "苹果", "华为", "特朗普", "利好", "浪漫", "马斯特",
                "特斯拉", "台湾", "香港", "美食", "微信", "晴天", "北京", "救援", "失败", "报警",
                "媒体", "新疆", "京东", "深圳", "爆炸", "事故", "征地", "抗议", "聚众", "黑社会",
                "堵路", "打砸", "罢工", "跳楼", "招募", "黑旅馆", "争议", "盗窃", "碰车", "示威",
                "不满", "黑中介", "失火", "举报", "公道", "经济学家", "中国新闻周刊", "永定河", "中国大地财产保险股份有限公司", "冬奧",
                "天津大事件");


        // 对比逻辑:相同的搜索词,去对比搜索时间,打印日志,校验搜索结果
        for (String queryString:queryList) {

            HashMap fields = new HashMap();
            fields.put("content", 1.0F);
            fields.put("title", 1.0F);
            QueryStringQueryBuilder queryBuilder = QueryBuilders.queryStringQuery(queryString).fields(fields).type(MultiMatchQueryBuilder.Type.PHRASE);
            SearchResponse data = commonsDao.basicSearch(queryBuilder, 10, true, "all_data");

            // 查询copy-to的字段
            HashMap copyToFields = new HashMap();
            copyToFields.put("full_search", 1.0F);
            QueryStringQueryBuilder copyToQueryBuilder = QueryBuilders.queryStringQuery(queryString).fields(copyToFields).type(MultiMatchQueryBuilder.Type.PHRASE);
            SearchResponse copyToData = commonsDao.basicSearch(copyToQueryBuilder, 10, true, "all_data_copy_to");

            log.info("copy-to测试对比(un copy-to vs copy-to), 搜索词 {},查询时间对比 {} vs {}, 查询性能提升 {}% ,查询结果对比 {} vs {}", queryString,
                    data.getTook().getMillis(), copyToData.getTook().getMillis(), (float)(data.getTook().getMillis() - copyToData.getTook().getMillis())/data.getTook().getMillis()*100,
                    data.getHits().getTotalHits().value, copyToData.getHits().getTotalHits().value);
        }
    }

测试结果如下:

 

关注
打赏
1664074814
查看更多评论
立即登录/注册

微信扫码登录

0.0478s