摘要:的能支持批量操作,大大提升了创建索引的效率。注意配置分词组件必须在创建索引之前,否则是无效的。调优的调优分两个层面,一是层面的调优,包括加大的可用内存及单线程内存。
ElasticSearch是一个强大的搜索服务器,基于Apache Lucene的全文搜索引擎开发,具有高性能、分布式和零配置的优点。在当前的项目中,我们希望ES能承担亿级文档的搜索,而ES也证明了即便面对这样的数据规模,也能实现十分迅速的搜索响应。
概念节点(Node):节点是一个ES的实例,一般一台主机上部署一个节点-
集群(Cluster):集群由若干节点组成,和任意节点的通信等价于和集群的通信
分片(Shard):一个索引会分成多个分片存储,分片数量在索引建立后不可更改
副本(Replica):副本是分片的一个拷贝,目的在于提高系统的容错性和搜索的效率
索引(Index):类似数据库的库
类型(Type):类似数据库的表
文档(Document):类似数据库的行,包含一个或多个Field
字段(Field):搜索的最小单元,可通过Mapping定义不同的属性(比如可否被搜索)
部署以ElasticSearch 1.5.0版本为例
ES的使用很简单,从官网下载压缩包后,解压后输入如下指令:
./bin/elasticsearch -d --cluster.name [your_cluster_name] --node.name [your_node_name]
一旦在多台主机上启动拥有同一个cluster.name的ES实例,它们会自动组成一个集群。
elasticsearch-headelasticsearch-head是一个必装的插件,它提供了一个web界面,显示集群和索引的状态,同时具备浏览和搜索文档的功能。只需要通过ES的plugin指令安装就OK了:
./bin/plugin -install mobz/elasticsearch-head同步
通常线上系统都不会使用ES作为主存储,从主存储创建索引的效率是我们关心的。ES的bulk API能支持批量操作,大大提升了创建索引的效率。以下是使用pyelasticsearch(非官方的一个Python客户端)批量创建索引的范例:
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重新编译了:
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包:
elasticsearch-analysis-ik-1.2.9.jar
httpclient-4.3.5.jar
httpcore-4.3.2.jar
commons-logging-1.1.3.jar
commons-codec-1.6.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
来自:建造者说
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/34037.html
...个Channel会有严格的速度控制,分两种,一种是控制每秒同步的记录数,另外一种是每秒同步的字节数,默认的速度限制是1MB/s,可以根据具体硬件情况设置这个byte速度或者record速度,一般设置byte速度,比如:我们可以把单个Chan...
... 7】ShardingSphere实现分库分表【搬砖工逆袭Java架构师 8】Elasticsearch详解(建议收藏)【搬砖工逆袭Java架构师 10】 Nginx详解七、数据结构与算法 【数据结构与算法 1】稀疏数组【数据结构与算法 2】循环队列【数据结构与算法 3】...
...,并尽可能降低平台的运维成本以及业务的开发成本。 Elasticsearch Elasticsearch 是一个高可用分布式搜索引擎,一方面技术相对成熟稳定,另一方面社区也比较活跃,因此我们在搭建搜索系统过程中也是选择了 Elasticsearch 作为我们...
...像有点搞笑,但我的确遇到过这样的情况。比如当把Kafka部署在Docker上时就容易出现进程启动但服务没有成功启动的情形。正常启动下,一个Kafka服务器起来的时候,应该有两个端口,一个端口是9092常规端口,会建一个TCP链接。...
...像有点搞笑,但我的确遇到过这样的情况。比如当把Kafka部署在Docker上时就容易出现进程启动但服务没有成功启动的情形。正常启动下,一个Kafka服务器起来的时候,应该有两个端口,一个端口是9092常规端口,会建一个TCP链接。...
阅读 3211·2021-11-25 09:43
阅读 2860·2021-10-08 10:04
阅读 1406·2019-08-26 12:20
阅读 1875·2019-08-26 12:09
阅读 312·2019-08-23 18:25
阅读 3399·2019-08-23 17:54
阅读 2097·2019-08-23 17:50
阅读 603·2019-08-23 14:33