1,Mac 上安装 (指定 java8)
brew cask install java8
vim .base_profile
文件内容:
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
source .base_profile
echo .base_profile
brew install elasticsearch
安装中文分词插件 (根据当前 es 版本):
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.1.2/elasticsearch-analysis-ik-6.1.2.zip
2, 优化配置
# 服务器优化: 更改索引片断数量
ulimit -n 32000
# 配置文集优化配置
自身配置文件: elasticsearch.yml
修改 bootstrap.mlockall: true, 禁止内存交换
jvm 配置文件 (GC):jvm.options
-Xms1g 初始分配内存 总内存的 60% 但不能超过 32G
-Xmx1g 最大使用内存
mac 中配置文件路径:
/usr/local/etc/elasticsearch
3,Elasticsearch 索引配置
使用 mappings 新建 index
curl - X PUT 'localhost:9200/kline_test' - H 'Content-Type: application/json' - d '{"settings": {"number_of_shards": 1,# 分片数"number_of_replicas" :0# 副本数: 未批量导入数据时建议不要进行副本
},
"mappings": {
"kline_data": {
"properties": {
"code": {
"type": "text", #数据类型
"include_in_all": false #禁用_all 查询
},
"name": {
"type": "text",
"include_in_all": false,# 禁用_all 查询
"analyzer": "ik_max_word",# 使用可以对文本进行最大数量的分词
"search_analyzer": "ik_max_word"
},
"market": {
"type": "byte",
"include_in_all": false,# 禁用_all 查询
},
"time": {
"type": "date" ,
"include_in_all": false,# 禁用_all 查询
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis",# 指定数据的查询格式
},
"mongo_id": {
"type": "text",
"index": False #不对该字段进行索引, 既无法作为查询条件
}
}
}
}'
}'※特别提示: 在 6.1 版本之后 doc 的字段属性: index 的配置参数变更为 True 或 False 而非之前的: not_analyzed 和 no 以下为各个字段的属性说明:(转自 http://blog.csdn.net/ntc10095/article/details/73730772)"status": {"type":"string", // 字符串类型"index": True// 是否被索引, True: 索引既可查询 ,Flase: 该字段将不可查询"analyzer":"ik"// 指定分词器"boost":1.23// 字段级别的分数加权"doc_values":false// 对 not_analyzed 字段, 默认都是开启, 分词字段不能使用, 对排序和聚合能提升较大性能, 节约内存"fielddata":{"format":"disabled"}// 针对分词字段, 参与排序或聚合时能提高性能, 不分词字段统一建议使用 doc_value"fields":{"raw":{"type":"string","index":"not_analyzed"}} // 可以对一个字段提供多种索引模式, 同一个字段的值, 一个分词, 一个不分词"ignore_above":100 // 超过 100 个字符的文本, 将会被忽略, 不被索引"include_in_all":ture// 设置是否此字段包含在_all 字段中, 默认是 true, 除非 index 设置成 no 选项"index_options":"docs"//4 个可选参数 docs(索引文档号) ,freqs(文档号 + 词频),positions(文档号 + 词频 + 位置, 通常用来距离查询),offsets(文档号 + 词频 + 位置 + 偏移量, 通常被使用在高亮字段) 分词字段默认是 position, 其他的默认是 docs"norms":{"enable":true,"loading":"lazy"}// 分词字段默认配置, 不分词字段: 默认 {"enable":false}, 存储长度因子和索引时 boost, 建议对需要参与评分字段使用 , 会额外增加内存消耗量"null_value":"NULL"// 设置一些缺失字段的初始化值, 只有 string 可以使用, 分词字段的 null 值也会被分词"position_increament_gap":0// 影响距离查询或近似查询, 可以设置在多值字段的数据上火分词字段上, 查询时可指定 slop 间隔, 默认值是 100"store":false// 是否单独设置此字段的是否存储而从_source 字段中分离, 默认是 false, 只能搜索, 不能获取值"search_analyzer":"ik"// 设置搜索时的分词器, 默认跟 ananlyzer 是一致的, 比如 index 时用 standard+ngram, 搜索时用 standard 用来完成自动提示功能"similarity":"BM25"// 默认是 TF/IDF 算法, 指定一个字段评分策略, 仅仅对字符串型和分词类型有效"term_vector":"no"// 默认不存储向量信息, 支持参数 yes(term 存储),with_positions(term + 位置),with_offsets(term + 偏移量),with_positions_offsets(term + 位置 + 偏移量) 对快速高亮 fast vector highlighter 能提升性能, 但开启又会加大索引体积, 不适合大数据量用
}
4, 谨慎分片
当在 ElasticSearch 集群中配置好你的索引后, 在集群运行中你无法调整分片设置. 既便以后需要调整分片数量, 也只能新建并对数据进行重新索引 (reindex)
虽然 reindex 会比较耗时, 但至少能保证你不会停机
每个分片都是有额外的成本的:
每个分片本质上就是一个 Lucene 索引, 因此会消耗相应的文件句柄, 内存和 CPU 资源
每个搜索请求会调度到索引的每个分片中. 如果分片分散在不同的节点倒是问题不太. 但当分片开始竞争相同的硬件资源时, 性能便会逐步下降
ES 使用词频统计来计算相关性. 当然这些统计也会分配到各个分片上. 如果在大量分片上只维护了很少的数据, 则将导致最终的文档相关性较差
分片数量的确定:
原则: 每个分片最好不超过 30G, 尽量不多过多分片
计算数量: 在确定之初最好能估算出日后数据的总量, 然后再进行分片 (例如: 未来数据可能是 300G, 那就至少需要 10-11 个分片)
※为保证查询质量, 建议还是分片数量不要过大; 网上有的人说分片不能超过 20 有的不能超过 100, 而分片容量也有分歧: 不能超过 20G 或 30G
※个人认为需根据实际情况来进行优化, 如果数据量再大且在增加额外的节点 (ES 会自动完成分片在不同节点上的分布平衡) 后效率仍然没有改善, 可新建另一个索引, 然后通过程序中间件进行访问控制 ※另外通过中间件可以进行特定数据存入指定分片 (参数:_shards:0,1,2), 从而达到特定数据的集中存储, 提高查询效率
节点数量确定 (初期):
节点数量 <= 分片数量 *(副本数量 + 1)
5, 使用 optimize 优化
- 随着时间的推移, ElasicSearch 中每个 shard 的数据也会越来越多, 索引越来越大, 而生成的 segment(在每个 shard 中, 每个索引文件实际是由多个 sgment 文件组成) 也会越来越多.
而 segment 越多的话, 则查询的性能越差, 所以通过调用 optimize 命令, 将多个 segment 合并成更少数量的 segment(最少为一个), 从而来提高查询性能.
curl -XPOST http://localhost:9200/shb01/_optimize?max_num_segments=1
- 在 es 中删除一个文档后不会立即从硬盘中删除只会标记这个文档被删除, lucene 会产生一个. del 文件, 而在检索过程中这个文件还会参与检索只不过在最后会被过滤掉,
这样其实也会影响效率, 我们可以定期删除这些文件, 同合并索引片断一样可以通过 curl
curl -XPOST http://localhost:9200/_optimize?only_expunge_deletes=true
来源: http://www.bubuko.com/infodetail-2478420.html