Elasticsearch-查询性能调优

1:配置合适的分词器

        Elasticsearch 内置了很多分词器,包括 standard、cjk、nGram 等,也可以安装自研/开源分词器。根据业务场景选择合适的分词器,避免全部采用默认 standard 分词器。
常用分词器:
        standard:默认分词,英文按空格切分,中文按照单个汉字切分。
        cjk:根据二元索引对中日韩文分词,可以保证查全率。
        nGram:可以将英文按照字母切分,结合ES的短语搜索(match_phrase)使用。
        IK:比较热门的中文分词,能按照中文语义切分,可以自定义词典。
        pinyin:可以让用户输入拼音,就能查找到相关的关键词。
        aliws:阿里巴巴自研分词,支持多种模型和分词算法,词库丰富,分词结果准确,适用于电商等对查准要求高的场景。

Elasticsearch-查询性能调优_第1张图片

Elasticsearch-查询性能调优_第2张图片

2:设置查询读取记录条数和字段 

 默认的查询请求通常返回排序后的前 10 条记录,最多一次读取 10000 条记录,通过 from 和 size 参数控制读取记录范围,避免一次读取过多的记录。通过 _source 参数可以控制返回字段信息,尽量避免读取大字段。 Elasticsearch-查询性能调优_第3张图片

3:设置 teminate_after 查询快速返回

如果不需要精确统计查询命中记录条数,可以配 teminate_after 指定每个 shard 最多匹配 N 条记录后返回,设置查询超时时间 timeout。在查询结果中可以通过 “terminated_early” 字段标识是否提前结束查询请求。 Elasticsearch-查询性能调优_第4张图片

4: 避免前缀模糊匹配

        Elasticsearch 默认支持通过 *? 正则表达式来做模糊匹配,如果在一个数据量较大规模的索引上执行模糊匹配,尤其是前缀模糊匹配,通常耗时会比较长,甚至可能导致内存溢出。尽量避免在高并发查询请求的生产环境执行这类操作。
        某客户需要对车牌号进行模糊查询,通过查询请求 "车牌号:*A8848*" 查询时,往往导致整个集群负载较高。通过对数据预处理,增加冗余字段 "车牌号.keyword",并事先将所有车牌号按照1元、2元、3元...7元分词后存储至该字段,字段存储内容示例:沪,A,8,4,沪A,A8,88,84,48,沪A8...沪A88488。通过查询"车牌号.keyword:A8848"即可解决原来的性能问题。

5:避免索引稀疏

        Elasticsearch6.X 之前的版本默认允许在一个 index 下面创建多个 type,Elasticsearch6.X 版本只允许创建一个 type,Elasticsearch7.X 版本只允许 type 值为 “_doc”。在一个索引下面创建多个字段不一样的 type,或者将几百个字段不一样的索引合并到一个索引中,会导致索引稀疏问题。
        建议每个索引下只创建一个 type,字段不一样的数据分别独立创建 index,不要合并成一个大索引。每个查询请求根据需要去读取相应的索引,避免查询大索引扫描全部记录,加快查询速度。

6: 扩容集群节点个数,升级节点规格

通常服务器节点数越多,服务器硬件配置规格越高,Elasticsearch 集群的处理能力越强。
在不同节点规模下的查询性能测试(测试环境:Elasticsearch5.5.3 集群,单节点16核CPU、64G内存、2T SSD盘,10亿条人口户籍登记信息,数据大小1TB, 20索引分片)。

 Elasticsearch-查询性能调优_第5张图片

不同集群节点规模写入性能测试(测试环境:Elasticsearch6.3.2 集群,单节点16核CPU、64G内存、2T SSD盘,10亿条人口户籍登记信息,单条记录1KB,数据集大小1TB,20个并发写入线程)。 

 

你可能感兴趣的:(ElasticSearch,elasticsearch,大数据,java,c#)