愚者求师之过,智者从师之长。

match_phrase的性能问题,求解

Elasticsearch | 作者 huahualal | 发布于2021年06月03日 | 阅读数:1875

运行环境:10数据节点+3主节点。版本7.6.2。数据节点64G内存+16核CPU+SSD。索引110个,总数量3.33T。
查询的索引 10个分片,2.5亿数据(实际为全国工商企业的基本信息)。查询的字段是默认分词,standard,查询语句如下:
 
GET base/_search
{
"track_total_hits": true,
"query": {
"match_phrase": {
"entName": "信息技术"
}
},"size": 20
}
响应结果如下:
 "took" : 4585,
"timed_out" : false,
"_shards" : {
"total" : 10,
"successful" : 10,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 431330,
"relation" : "eq"
},
在不改匹配方式与分词器的情况下,有办法优化吗?试过二次打分,一是效率没有明显提升,二是会影响业务上的排序。
求教各位大佬,要求1秒内响应
已邀请:

Charele - Cisco4321

赞同来自:

贴出profile

huahualal

赞同来自:

这个就是大佬们口中的profile吗。。瑟瑟发抖

zmc - ES PAAS、JuiceFS

赞同来自:

match_phrase操作本身就是比较耗时的,大概有四个方向可以优化,看场景选择;
1.数据预热,提前加载好缓存,如果你们的数据大多是热数据,那缓存后会快很多
2.如果响应时间要求不高,且qps比较高,可以通过加cpu配置缓解问题
3.使用term查询,配置自定义词库,利用分词解决问题
4.先filter,match全文检索找到结果集合,然后在结果集合中取前x条进行match_phrase重新打分,根据分数大到小返回;这个方案线上测过,对于很复杂的请求优化很有限,你这个相对简单的请求可以测一把看看...
 

要回复问题请先登录注册