在对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<String> queryList = Arrays.asList("中国", "美国", "拜登", "疫情", "苹果", "华为", "特朗普", "利好", "浪漫", "马斯特",
"特斯拉", "台湾", "香港", "美食", "微信", "晴天", "北京", "救援", "失败", "报警",
"媒体", "新疆", "京东", "深圳", "爆炸", "事故", "征地", "抗议", "聚众", "黑社会",
"堵路", "打砸", "罢工", "跳楼", "招募", "黑旅馆", "争议", "盗窃", "碰车", "示威",
"不满", "黑中介", "失火", "举报", "公道", "经济学家", "中国新闻周刊", "永定河", "中国大地财产保险股份有限公司", "冬奧",
"天津大事件");
// 对比逻辑:相同的搜索词,去对比搜索时间,打印日志,校验搜索结果
for (String queryString:queryList) {
HashMap<String, Float> 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<String, Float> 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);
}
}
测试结果如下:文章来源:https://www.toymoban.com/news/detail-418487.html
文章来源地址https://www.toymoban.com/news/detail-418487.html
到了这里,关于ES优化实战-通过开启copy_to提升一倍的检索性能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!