在对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 { // 搜索词 ListqueryList = 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); } }
测试结果如下: