[关闭]
@zh350229319 2019-05-27T02:11:44.000000Z 字数 2340 阅读 642

ElasticSearch优化

ElasticSearch


参考 ElasticSearch 5.X 最佳实践

索引结构优化

elastic默认索引类型如下,查询时可以使用fieldName或fieldName.keyword查询,浪费存储空间,需要改成特定需要的类型。

  1. "fieldName": {
  2. "type": "text",
  3. "fields": {
  4. "keyword": {
  5. "type": "keyword",
  6. "ignore_above": 256
  7. }
  8. }

常用类型映射

Java类型 ElasticSearch类型
int integer
long long
float float
double double
char keyword
boolean boolean
String keyword/text
DateTime date

数字类型:根据实际的数据范围选择合适的类型,具体参考Numeric
keyword 使用建议:较短的字段查询,支持term、prefix、wildcard,其中prefix和wildcard在文本种类量大时,存在查询性能问题。默认查询256字符
text 使用建议:较长的字段查询,分词场景,支持match
date 使用建议:按照以下格式定义

  1. "dateField": {
  2. "type": "date",
  3. "format": "yyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
  4. }

keyword 前缀查询优化

索引结构:保留keyword类型保存原文

  1. "fieldName": {
  2. "type": "keyword",
  3. "words": {
  4. "type": "text",
  5. "analyzer": "ngramIndexAnalyzer"
  6. }

使用前缀查询时使用

  1. #索引结构定义
  2. PUT {INDEX_PAATERN}
  3. {
  4. "index": {
  5. "analysis": {
  6. "filter": {
  7. "edge_ngram_filter": {
  8. "type": "edge_ngram",
  9. "min_gram": 1,
  10. "max_gram": 50 # 前缀最大匹配数
  11. }
  12. },
  13. "analyzer": {
  14. "ngramIndexAnalyzer": {
  15. "type": "custom",
  16. "tokenizer": "keyword",
  17. "filter": ["edge_ngram_filter", "lowercase"]
  18. }
  19. }
  20. }
  21. }
  22. }
  23. # 查询条件
  24. "term": {
  25. "fieldName.words": {
  26. "value": "湖北"
  27. }
  28. }

检索字段配置优化

doc_value和norms设置比较常用
- "doc_value":false
sort、aggregate、script将无法使用,可以节省磁盘空间
- "norms":false
text 字段不需要评分时可以关闭
- "index":false
当字段需要 histograms 不需要 filter 时,可以禁用映射
- "index_options":freqs
text 字段也默认存储索引中的频率和位置。频率用于计算分数,位置用于运行短语查询(phrase queries)。 如果不需要运行短语查询时可以设置。
- 禁用 _all 字段
_all 字段是由所有字段拼接成的超级字段,如果在查询中已知需要查询的字段,就可以考虑禁用它。

最大翻页数

优先使用 scroll 方式分页查询
因为使用 from to 方式查询性能很低,Elastic限制了最大翻页结果数。如果一定需要开启可以添加以下配置

  1. PUT {INDEX_PAATERN}/_settings
  2. {
  3. "index":{
  4. "max_result_window":100000000
  5. }
  6. }

写入性能优化

增大刷写间隔

适合新增数据查询实时性要求低的索引

  1. PUT {INDEX_PAATERN}/_settings
  2. {
  3. "index.refresh_interval" : "30s"
  4. }

设置线程数量

GET _nodes/thread_pool 可以查看默认的配置
调整 elasticsearch.yml ,对 bulk/flush 线程池进行调优

  1. threadpool.bulk.size:8 #(CPU核数)
  2. threadpool.flush.size:8 #(CPU核数)
  3. ````
  4. <div class="md-section-divider"></div>
  5. ## 配置优化
  6. <div class="md-section-divider"></div>
  7. ### 设置 JVM 堆大小
  8. 内存 < 64GJVM 设置为内存的一半,最大 31G
  9. 内存 >= 64G:设置为 31G
  10. <div class="md-section-divider"></div>

Step1. 修改 ${PATH_TO_ElasticSearch_HOME}/config/jvm.options 中的 Xms 和 Xmx

-Xms31g
-Xmx31g

Step2. 重启 elasticsearch

  1. <div class="md-section-divider"></div>
  2. ### 关闭 SWAP
  3. 可以关闭系统SWAP或者修改以下配置
  4. <div class="md-section-divider"></div>

修改 ${PATH_TO_ES_HOME}/config/elasticsearch.yml,添加:

bootstrap.memory_lock: true
```

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注