ElasticSearch是一个强大的搜索服务器,基于Apache Lucene
的全文搜索引擎开发,具备高性能、分布式和零配置的优势。在当前的项目中,咱们但愿ES能承担亿级文档的搜索,而ES也证实了即使面对这样的数据规模,也能实现十分迅速的搜索响应。html
Mapping
定义不一样的属性(好比能否被搜索)以
ElasticSearch 1.5.0
版本为例node
ES的使用很简单,从官网下载压缩包后,解压后输入以下指令:python
./bin/elasticsearch -d --cluster.name [your_cluster_name] --node.name [your_node_name]
一旦在多台主机上启动拥有同一个cluster.name
的ES实例,它们会自动组成一个集群。git
elasticsearch-head是一个必装的插件,它提供了一个web界面,显示集群和索引的状态,同时具有浏览和搜索文档的功能。只须要经过ES的plugin
指令安装就OK了:github
./bin/plugin -install mobz/elasticsearch-head
一般线上系统都不会使用ES做为主存储,从主存储建立索引的效率是咱们关心的。ES的bulk API能支持批量操做,大大提高了建立索引的效率。如下是使用pyelasticsearch
(非官方的一个Python客户端)批量建立索引的范例:web
pythonfrom pyelasticsearch import ElasticSearch from pyelasticsearch import bulk_chunks es = ElasticSearch() def documents(): for _doc in docs: yield es.index_op(doc=_doc, id=doc['id']) for chunk in bulk_chunks(documents(), docs_per_chunk=500, bytes_per_chunk=10000): es.bulk(chunk, index='index-test', doc_type='doc')
单机索引200万条记录的耗时约10分钟。数据库
ES支持中文的前提是安装正确的分词组件,好比elasticsearch-analysis-ik。但貌似该组件的最新版本(1.2.9)不支持plugin
指令直接安装,只能经过Maven
从新编译了:bootstrap
git clone https://github.com/medcl/elasticsearch-analysis-ik.git --depth 1 cd elasticsearch-analysis-ik/ # 真心但愿你的网络棒棒嗒 mvn package unzip ./target/releases/elasticsearch-analysis-ik-1.2.9.zip
zip解压获得5个jar包:缓存
返回ES目录,新建路径./plugins/analysis-ik
并把上述jar包所有移进去。
第二步,把elasticsearch-analysis-ik/config/ik
文件夹(IK
自带的词典)复制到ES目录的./config
路径下。
第三步,在./config/elasticsearch.yml
文件的最后加上:服务器
index: analysis: analyzer: ik: alias: [news_analyzer_ik,ik_analyzer] type: org.elasticsearch.index.analysis.IkAnalyzerProvider index.analysis.analyzer.default.type : "ik"
至此大功告成。注意配置分词组件必须在建立索引以前,不然是无效的。
ES的调优分两个层面,一是Java层面的调优,包括加大JVM的可用内存及单线程内存。
对Unix系统,可修改./bin/elasticsearch.in.sh
文件:
# 通常分配主机1/4-1/2的内存 if [ "x$ES_MIN_MEM" = "x" ]; then ES_MIN_MEM=12g fi if [ "x$ES_MAX_MEM" = "x" ]; then ES_MAX_MEM=12g fi JAVA_OPTS="$JAVA_OPTS -Xms${ES_MIN_MEM}" JAVA_OPTS="$JAVA_OPTS -Xmx${ES_MAX_MEM}" # 线程大小, ES单线程承载的数据量比较大 JAVA_OPTS="$JAVA_OPTS -Xss128m"
调优的第二个层面是ES自己的调优,修改./config/elasticsearch.yml
文件,关键的项目以下所示:
# 分片数量,推荐分片数*副本数=集群数量 # 分片会带来额外的分割和合并的损耗,理论上分片数越少,搜索的效率越高 index.number_of_shards: 20 # 锁定内存,不让JVM写入swapping,避免下降ES的性能 bootstrap.mlockall: true # 缓存类型设置为Soft Reference,只有当内存不够时才会进行回收 index.cache.field.max_size: 50000 index.cache.field.expire: 10m index.cache.field.type: soft
来自:建造者说