一. 基本概述
二. 方法
1. query方法(org.elasticsearch.index.query包)
-
MatchQueryBuilder matchQuery(String name, Object text) {}
:会将搜索词分词,再与目标查询字段进行匹配,若分词中的任意一个词与目标字段匹配上,则可查询到。 -
TermQueryBuilder termQuery(String name, int value) {}
:不会对搜索词进行分词处理,而是作为一个整体与目标字段进行匹配,若完全匹配,则可查询到。
三. 分词
四. 自动补全
五. 调优
代码层面:
- query不必要全是must,must是必须满足的条件,如果不是必须,可以用should
- 只返回需要的数据集,用
public SearchRequestBuilder setFetchSource(@Nullable String include, @Nullable String exclude) {}
索引与配置层面:
- 索引读写优化:在settings中
"index.store.type":"niofs"
,读写索引使用Nio file system - 当索引结构比较稳定时,可以使用
"dynamic":"strict"
以严格模式来动态索引 - es6.0版本之前
"_all":{"enabled":false}
防止所有的字段都被索引起来做分词,可以节省很多空间,提高性能 - 在settings中
"index.query.default_field":"title"
: 默认query_string等是走的all,这样配置可以设置默认查询的索引 - 分片大小最好控制在10~20G,性能最佳
- 网络波动等造成的分片挂掉后一段时间 , 自动恢复机制开启时 , 数据太多可能会影响集群不稳定 , 可以设置延迟恢复策略
"index.unassigned.node_left.delayed_timeout": "5m"
延迟五分钟 - es刷新索引并不是真正实时刷新 , 而是有默认间隔为1s的刷新 , 可以根据实际情况更改put
ip:9200/_cluster/settings
中"index.refresh_interval":"30s"
(5.x版本以上不适用 , 有新格式代替) - 节点之间的哨兵机制可能会被jvm的gc中stop the world而判断错误 , 启动恢复策略 , 可以适当调增ping的超时时间与重试次数 , 在配置文件中修改
#节点间存活检测时间
discovery.zen.fd.ping_interval=10s
#存活超时时间
discovery.zen.fd.ping_timeout=60s
#存活超时重试次数
discovery.zen.fd.ping_retries=5
- master只协调不存数据
node.master=true
,node.data=false
- jvm设置不要超过总内存50% , 也不要超过32G , 此外设置的越大越好
- 硬件上 , 使用ssd
- 一次性写入大量数据 , 不要用index的api , 要用bulk , 异步接口提升qps
六. 技术栈
- logstash
- kibana
网友评论