ElasticSearch 搜索集群
来源:互联网 发布:名字创意设计软件 编辑:程序博客网 时间:2024/06/03 07:22
搜索的目的:让公开的信息易于查找。
ES简介
elasticsearch是一个底层基于Lucene的实时的分布式搜索和分析引擎。
es被设计用于云计算中,为分布式而生。
优点:实时搜索,稳定,可靠,快速,安装使用方便。
使用者:GitHub,由solr技术升级到es
es的特点:为分布式而生的近实时搜索,基于REST风格,支持json格式,异步提供建索引和搜索服务。
(solr类似webservice服务,支持json和xml风格,同步提供建立索引和搜索服务,不能在建索引的同时提供搜索服务)
es的平均查询速度比solr快数十倍。
基于restful接口:我给你一个restful格式的请求,你给我一个json格式的数据
restful请求格式:…/get/a/1 普通请求格式:…get?a=1
Rest简介
使用rest操作一组资源,比如http://example.com/resources/
使用rest操作单个资源,比如http://example.com/resources/142
Rest操作
参考下文 curl命令
POST 增加 DELETE 删 PUT 改 GET 查 HEAD 获取头信息
ES内置的Rest接口
ES与关闭型数据库的对比
index和type相当与两个隔离级别,它们把不同类型的索引数据分开储存,分开搜索,可以极大的提高搜索效率
ES搭建
1准备集群node{1,2,3}
从node1克隆node{2,3}
配置集群主机名node{1,2,3}
配置集群IP 192.168.13.{11,12,13}
配置node1到node{2,3}的免密钥登陆
配置集群hosts
192.168.13.11 node1192.168.13.12 node2192.168.13.13 node3192.168.13.14 node4
2安装ES
作用:提供搜索服务
上传elasticsearch-2.2.0.tar.gz
到 /opt/soft/
解压[root@node1 soft]# tar zxf elasticsearch-2.2.0.tar.gz
配置[root@node1 soft]# vi elasticsearch-2.2.0/config/elasticsearch.yml
添加以下内容:
cluster.name: cklnode.name: node1network.host: 192.168.13.11discovery.zen.ping.multicast.enabled: falsediscovery.zen.ping_timeout: 120sclient.transport.ping_timeout: 60sdiscovery.zen.ping.unicast.hosts: ["192.168.13.11","192.168.13.12", "192.168.13.13"]
3安装Kibana
作用:查看ES集群状态 [root@node1 soft]# ./elasticsearch-2.2.0/bin/plugin install mobz/elasticsearch-head
4安装Marvel
作用:在簇中从每个节点汇集数据 [root@node1 soft]# ./elasticsearch-2.2.0/bin/plugin install license
[root@node1 soft]# ./elasticsearch-2.2.0/bin/plugin install marvel-agent
(若下载不了,可在自己的网盘里找)
marvel依赖Kibana,所以再安装Kibana:
上传kibana-4.4.1-linux-x64.tar.gz
到/opt/soft/
解压[root@node1 soft]# tar zxf kibana-4.4.1-linux-x64.tar.gz
[root@node1 soft]# vim kibana-4.4.1-linux-x64/config/kibana.yml
elasticsearch.url: "http://192.168.13.11:9200"
[root@node1 soft]#./kibana-4.4.1-linux-x64/bin/kibana plugin --install elasticsearch/marvel/2.2.0
5分发ES到其它节点
[root@node1 soft]# scp -r elasticsearch-2.2.0 root@node2:/opt/soft
[root@node1 soft]# scp -r elasticsearch-2.2.0 root@node3:/opt/soft
6各节点修改对应的配置
[root@node1 soft]# vi elasticsearch-2.2.0/config/elasticsearch.yml
修改以下内容:
node.name: node{2,3}
network.host: 192.168.13.{12,13}
7启动集群
安全问题,不让用root登陆
所有节点运行:[root@node{1,2,3} soft]# groupadd bigdata
useradd -g bigdata bigdata
echo "123456"| passwd --stdin bigdata
chown -R bigdata:bigdata ./elasticsearch-2.2.0
su bigdata
[bigdata@node{1,2,3 soft]$./elasticsearch-2.2.0/bin/elasticsearch
node1运行: [root@node1 soft]# ./kibana-4.4.1-linux-x64/bin/kibana
8测试
使用head插件 http://192.168.13.11:9200/_plugin/head/
查看node1上的es信息 http://192.168.13.11:9200/
使用kibana查看集群状态 http://192.168.13.11:5601/
查看集群健康状态 http://node1:9200/_cluster/health?pretty
CRUL命令
curl是是利用URL语法在命令行方式下工作的开源文件传输工具
-x 指定http请求的方法 HEAD GET POST PUT DELETE
-d 指定要传输的数据
建库
索引库名称必须要全部小写,不能以下划线开头,也不能包含逗号
curl -XPUT http://node1:9200/db1/curl -XPUT http://node1:9200/db2/
删除
删除索引文件,只是标记删除,其标记在一个表里存放
curl -XDELETE http://node1:9200/db2/curl -XDELETE http://node1:9200/db2/emp/2
建索引
若不指定文档Id,则使用UUID随机生成一个Id并分配给它
curl -XPOST http://node1:9200/db1/employee/1 -d '{"first_name" : "John","last_name" : "Smith","age" : 25,"about" : "I love to go rock climbing","interests": [ "sports", "music" ]}'
curl -XPOST http://node1:9200/db1/emp/ -d '{"first_name" : "John"}'
put是幂等方法,post不是。比如:int i=0和i++,前者是幂等方法。幂等方法执行多次,效果等效于1次。
创建操作可以使用POST,也可以使用PUT。
区别在于POST是作用在一个集合资源之上的(/articles),而PUT操作是作用在一个具体资源之上的(/articles/123)
修改索引
使用put 修改,若没有数据,则等效于post创建。 curl -XPUT http://node1:9200/db1/emp/2 -d '{"name":"zs","age":25}'
获取索引
curl -XGET http://node1:9200/db1/employee/1?pretty
获取带头部信息的索引: curl -i http://node1:9200/db1/employee/1?pretty
只获取索引的头部信息(探测文件是否存在): curl -i -XHEAD http://node1:9200/db1/employee/1
只获取部分字段: curl -XGET http://node1:9200/db1/employee/1?_source=name,age
只获取source信息: curl -XGET http://node1:9200/db1/employee/1/_source
查询一个表里的所有索引: curl -XGET http://node1:9200/db1/emp/_search
按条件查询指定的索引(单条件查询): curl -XGET http://node1:9200/db1/employee/_search?q=last_name:Smith
重点:DSL查询
领域特定语言:参考官方文档
查询姓氏是smith的索引:
curl -XGET http://node1:9200/db1/employee/_search -d '{"query": { "match":{"last_name":"Smith"} }}'
在姓或名两个字段中查询含smith的索引:
curl -XGET http://node1:9200/db1/employee/_search -d '{"query":{ "multi_match": { "query":"Smith", "fields":["first_name","last_name"] }}}'
查询名John 并且 姓Smith的人的索引:
curl -XGET node1:9200/db1/employee/_search -d '{"query":{"bool":{"must":[{"match":{"first_name":"John"}},{"match":{"last_name":"Smith"}}]}}}'
查询名John 或者 姓Smith的人的索引:
curl -XGET node1:9200/db1/employee/_search -d '{"query":{"bool":{"should":[{"match":{"first_name":"John"}},{"match":{"last_name":"Smith"}}]}}}'
MGET获取多个文档
获取不同索引库里的文档:
curl -XGET http://node1:9200/_mget?pretty -d '{"docs":[{"_index":"db1","_type":"emp","_id":2,"_source":"name"},{"_index":"db2","_type":"blog","_id":2}]}'
获取同一个索引库里的文件:
curl -XGET http://node1:9200/db1/_mget?pretty -d '{"docs":[{"_type":"emp","_id":2,"_source":"name"},{"_type":"blog","_id":2}]}'
获取同一个索引库里同一类的多个索引文件:
curl -XGET http://node1:9200/db1/_mget?pretty -d '{"ids":["1","2"]}'
添加旧索引的新字段
curl -XPOST http://node1:9200/db1/emp/_update -d '{"doc":{"father_name" : "John"}}'
timed_out
告诉了我们查询是否超时
curl -XGET http://localhost:9200/_search?timeout=10ms
es会在10ms之内返回查询内容
注意:timeout并不会终止查询,它只是会在你指定的时间内返回当时已经查询到的数据,然后关闭连接。
在后台,其他的查询可能会依旧继续,尽管查询结果已经被返回了。
删除索引
If you use the Delete by Query API, after upgrading to 2.0, just install the plugin and then follow its documentation
bin/plugin install delete-by-query curl -XDELETE 'http://node1:9200/_all/emp,employee/_query?q=first_name:kimchy'
用的少,用的时候再查文档
ES扩展
批量操作bulk
版本控制
各种插件
ES核心概念
集群cluster
代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。这个东西和zookeeper类似。
主
主节点的职责是负责管理集群状态,包括管理分片的状态和副本的状态,以及节点的发现和删除。
默认情况下,只需要在同一个网段之内启动多个es节点,就可以自动组成一个集群。
类名:...\elasticsearch-2.2\core\src\main\java\org\elasticsearch\discovery\zen\ZenDiscovery.java
方法:findMaster
作用:把有权利做主节点的节点通过NodeId排序后取出来放到一个list里面,取第一个做主节点
。
补充:NodeId是每台机器启动时获得的,节点启动时会广播,发现别的NodeId,就取最大的NodeId+1,没发现就是从1开始。
shard分片
代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。
分片的数量只能在索引创建前指定,并且索引创建后不能更改(后面的版本可能会支持修改)。
可以在创建索引库的时候指定分片数量:
curl -XPUT 'http://node1:9200/db3/' -d'{"settings":{"number_of_shards":3}}'
默认是一个索引库有5个分片
index.number_of_shards: 5
replicas索引副本
es可以给索引设置副本的数量,和hadoop不一样,这个值不包含主副本。
当索引数据发生变化时,先修改主副本。
副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。
二是提高es的查询效率,es会自动对搜索请求进行负载均衡。
可以在创建索引库的时候指定/修改: curl -XPUT 'node1:9200/db4/_settings' -d'{"settings":{"number_of_replicas":2}}'
默认是一个分片有1个副本(即2份数据):
index.number_of_replicas: 1
recovery数据恢复
叫数据重新分布
es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。
gateway存储方式
es默认是先把索引存放到内存中,当内存满了时再持久化到硬盘。当这个es集群关闭再重新启动时就会从gateway中读取索引数据。es支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。
如果需要将数据落地到hadoop的hdfs需要先安装插件elasticsearch/elasticsearch-hadoop
然后在elasticsearch.yml里配置,下面是namenode非高可用的配置:
type: hdfshdfs: uri: hdfs://node1:9000
discovery.zen
代表es的自动发现节点机制,es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。
不同网段的节点如何组成es集群:
1禁用自动发现机制
discovery.zen.ping.multicast.enabled: false
2设置新节点被启动时能够发现的主节点列表,相互必须能ping
discovery.zen.ping.unicast.hosts: ["192.168.13.11", "192.168.14.11"]
Transport
代表es内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互。
es支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)。
java代码/客户端一般通过9300端口与es进行交互。
settings和mappings
settings修改索引库默认配置,例如:分片数量,副本数量
查看: curl -XGET http://node1:9200/db1/_settings?pretty
修改: curl -XPUT 'node1:9200/db1/_settings' -d'{"settings":{"number_of_shards":3,"number_of_replicas":2}}'
Mapping就是对索引库中索引的字段名称及其数据类型进行定义,类似于关系数据库中表建立时要定义字段名及其数据类型那样,(和solr中的schme类似)不过es的mapping比数据库灵活很多,它可以动态添加字段。
一般不需要要指定mapping都可以,因为es会自动根据数据格式定义它的类型,如果你需要对某些字段添加特殊属性(如:定义使用其它分词器、是否分词、是否存储等),就必须手动添加mapping。
查询索引库的mapping信息: curl -XGET http://node1:9200/db1/emp/_mapping?pretty
mappings修改字段相关属性:
例如:字段类型,使用哪种分词工具
集成中文分词器
安装IK
下载地址 下载版本请参考网站上的指南
(自己网盘里也有)
下载后要使用mvn编译
copy and unzip target/releases/elasticsearch-analysis-ik-{version}.zip to /opt/soft/elasticsearch-2.2.0/plugins/ik/ yum install -y unzip
[root@node1 ik]# unzip elasticsearch-analysis-ik-1.8.0.zip
查看ik配置/描述文件,一般的插件都有这个文件: [root@node1 ik]# cat plugin-descriptor.properties
每台机器上都要有这个插件,所以要同步到其它es节点上: [root@node1 plugins]# scp -r ./ik root@node{2,3}:/opt/soft/elasticsearch-2.2.0/plugins/
[root@node{1,2,3} plugins]# chown -R bigdata:bigdata ./ik
重启ES集群生效
使用IK
1.create a index
curl -XPUT http://node1:9200/index
2.create a mapping
curl -XPOST http://node1:9200/index/fulltext/_mapping -d'{ "fulltext": { "_all": { "analyzer": "ik_max_word", "search_analyzer": "ik_max_word", "term_vector": "no", "store": "false" }, "properties": { "content": { "type": "string", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word", "include_in_all": "true", "boost": 8 } } }}'
3.index some docs
curl -XPOST http://node1:9200/index/fulltext/1 -d'{"content":"美国留给伊拉克的是个烂摊子吗"}'curl -XPOST http://node1:9200/index/fulltext/2 -d'{"content":"公安部:各地校车将享最高路权"}'curl -XPOST http://node1:9200/index/fulltext/3 -d'{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}'curl -XPOST http://node1:9200/index/fulltext/4 -d'{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}'
4.query with highlighting
curl -XPOST http://node1:9200/index/fulltext/_search -d'{ "query" : { "match" : { "content" : "中国" }}, "highlight" : { "pre_tags" : ["<tag1>", "<tag2>"], "post_tags" : ["</tag1>", "</tag2>"], "fields" : { "content" : {} } }}'
5执行过程截图
[root@node1 ~]# curl -XPOST http://node1:9200/index/fulltext/_search?pretty -d'> {> "query" : { "match" : { "content" : "中国" }},> "highlight" : {> "pre_tags" : ["<tag1>", "<tag2>"],> "post_tags" : ["</tag1>", "</tag2>"],> "fields" : {> "content" : {}> }> }> }'{ "took" : 7, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 2, "max_score" : 1.5, "hits" : [ { "_index" : "index", "_type" : "fulltext", "_id" : "4", "_score" : 1.5, "_source" : { "content" : "中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首" }, "highlight" : { "content" : [ "<tag1>中国</tag1>驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首" ] } }, { "_index" : "index", "_type" : "fulltext", "_id" : "3", "_score" : 0.53699243, "_source" : { "content" : "中韩渔警冲突调查:韩警平均每天扣1艘中国渔船" }, "highlight" : { "content" : [ "中韩渔警冲突调查:韩警平均每天扣1艘<tag1>中国</tag1>渔船" ] } } ] }}[root@node1 ~]#
ES集群的java API
前提是已经打好搜索集群了。
使用JavaAPI的具体过程可以看官网
1安装配置JDK
jdk-7u80-windows-x64.exe
2安装配置IDEA
ideaIU-15.0.2.exe
注册时选择 License server
,填 http://idea.lanyus.com
,然后点击OK
3新建Java工程
导入ES包(…\elasticsearch-2.2.0\lib)后敲出以下代码:
import org.elasticsearch.action.delete.DeleteResponse;import org.elasticsearch.action.get.GetResponse;import org.elasticsearch.action.index.IndexResponse;import org.elasticsearch.client.Client;import org.elasticsearch.client.transport.TransportClient;import org.elasticsearch.common.settings.Settings;import org.elasticsearch.common.transport.InetSocketTransportAddress;import java.io.IOException;import java.net.InetAddress;import java.util.HashMap;import java.util.Map;import java.util.concurrent.ExecutionException;import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;/** * Created by root on 2016/9/25. */public class TestES { public static void main(String[] args) throws IOException, ExecutionException, InterruptedException {// 连接到ES集群 Settings settings = Settings.settingsBuilder() .put("cluster.name", "ckl").build(); Client client = TransportClient.builder().settings(settings).build() .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("node1"), 9300)) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("node2"), 9300)) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("node3"), 9300));// 添加一个索引 Map<String, String> map = new HashMap<>(); map.put("name", "ls"); map.put("age", "22"); map.put("sex", "man"); IndexResponse response1 = client.prepareIndex("db1", "emp", "1").setSource(map).execute().actionGet();// 查询上面添加的索引 System.out.println(client.prepareGet("db1", "emp", "1").execute().actionGet().getSourceAsString());// 修改刚刚添加的索引 client.prepareUpdate("db1", "emp", "1").setDoc(jsonBuilder().startObject().field("name", "ww").endObject()).get(); System.out.println(client.prepareGet("db1", "emp", "1").execute().actionGet().getSourceAsString());// 查看db1索引库中索引的数量 long count = client.prepareCount("db1").execute().get().getCount(); System.out.println("db1索引库中索引的数量是:" + count);// 删除刚刚添加的索引 client.prepareDelete("db1", "emp", "1").execute().actionGet();// 此处应出现空指针异常 System.out.printf(client.prepareGet("db1", "emp", "1").execute().actionGet().getSourceAsString()); }}
ES搜索类型
详细参考:资料
1、query and fetch
向索引的所有分片(shard)都发出查询请求,各分片返回的时候把元素文档(document)和计算后的排名信息一起返回。这种搜索方式是最快的。因为相比下面的几种搜索方式,这种查询方法只需要去shard查询一次。但是各个shard返回的结果的数量之和可能是用户要求的size的n倍。
2、query then fetch(默认的搜索方式)
慢一点点,效果好很多。如果你搜索时,没有指定搜索方式,就是使用的这种搜索方式。这种搜索方式,大概分两个步骤,第一步,先向所有的shard发出请求,各分片只返回排序和排名相关的信息(注意,不包括文档document),然后按照各分片返回的分数进行重新排序和排名,取前size个文档。然后进行第二步,去相关的shard取document。这种方式返回的document与用户要求的size是相等的。
3、DFS query and fetch
这种方式比第一种方式多了一个初始化散发(initial scatter)步骤,有这一步,据说可以更精确控制搜索打分和排名。
4、DFS query then fetch
比第2种方式多了一个初始化散发(initial scatter)步骤。
一句话总结: 1最快 4最准 2折中
ES优化
ES分片查询
默认是randomize across shards随机选取,表示随机的从分片中取数据
_local:指查询操作会优先在本地节点有的分片中查询,没有的话再在其它节点查询。
_primary:指查询只在主分片中查询
_primary_first:指查询会先在主分片中查询,如果主分片找不到(挂了),就会在副本中查询。
_only_node:指在指定id的节点里面进行查询,如果该节点只有查询索引的部分分片,就只在这部分分片中查找,所以查询结果可能不完整。如_only_node:123在节点id为123的节点中查询。
_prefer_node:nodeid优先在指定的节点上执行查询
_shards:0 ,1,2,3,4:查询指定分片的数据
自定义:_only_nodes:根据多个节点进行查询
ES脑裂
参数discovery.zen.minimum_master_nodes
用于控制选举行为发生的最小集群节点数量
什么是脑裂?
所谓脑裂问题(类似于精神分裂),就是同一个集群中的不同节点,对于集群的状态有了不一样的理解。
正常情况下,集群中的所有的节点,应该对集群中master的选择是一致的,这样获得的状态信息也应该是一致的,
不一致的状态信息,说明不同的节点对master节点的选择出现了异常,也就是所谓的脑裂问题。
这样的脑裂状态直接让节点失去了集群的正确状态,导致集群不能正常工作。
脑裂产生的原因
- 网络:
由于是内网通信,网络通信问题造成某些节点认为master死掉,而另选master的可能性较小 - 节点负载:
由于master节点与data节点都是混合在一起的,所以当工作节点的负载较大时,导致对应的ES实例停止响应,
而这台服务器如果正充当着master节点的身份,那么一部分节点就会认为这个master节点失效了,故重新选举新的节点,
这时就出现了脑裂;同时由于data节点上ES进程占用的内存较大,较大规模的内存回收操作也能造成ES进程失去响应。
脑裂解决
主节点(给它当主节点的权利,它不一定是主节点)
node.master:truenode.data:false
从节点
node.master:falsenode.data:true
所有节点
discovery.zen.ping.multicast.enabled:falsediscovery.zen.ping.unicast.hosts:["node1","node2","node3"]
最大打开文件数
查看 ulimit -a
设置 ulimit -32000
修改ES的JVM内存大小
修改bin/elasticsearch.in.sh中ES_MIN_MEM和ES_MAX_MEM的大小为服务器内存的60%左右
设置mlockall锁
锁定进程的物理内存地址
避免交换(swapped)来提高性能
修改文件conf/elasticsearch.yml
boostrap.mlockall: true
设置分片数量
分片多的话,可以提升建立索引的能力,5-20个比较合适。
如果分片数过少或过多,都会导致检索比较慢。分片数过多会导致检索时打开比较多的文件,另外也会导致多台服务器之间通讯。
而分片数过少会导至单个分片索引过大,所以检索速度慢。建议单个分片最多存储20G左右的索引数据,
所以,分片数量=数据总量/20G
设置副本数量
副本多的话,可以提升搜索的能力,但是如果设置很多副本的话也会对服务器造成额外的压力,因为需要同步数据。
所以建议设置2-3个即可。
优化索引
对索引进行优化,不然segment越多,查询的性能就越差
索引量不是很大的话情况下可以将segment设置为1 curl -XPOST 'http://node1:9200/db1/_optimize?max_num_segments=1'
java代码:
client.admin().indices().prepareOptimize(“db1”).setMaxNumSegments(1).get();
定时删除文档
在Lucene中删除文档,数据不会马上在硬盘上除去,而是在lucene索引中产生一个.del的文件,
而在检索过程中这部分数据也会参与检索,lucene在检索过程会判断是否删除了,如果删除了在过滤掉。
这样也会降低检索效率。所以可以执行清除删除文档 curl -XPOST 'http://node1:9200/elasticsearch/_optimize?only_expunge_deletes=true'
JAVA: client.admin().indices().prepareOptimize(“elasticsearch”).setOnlyExpungeDeletes(true).get();
初次导入
如果在项目开始的时候需要批量入库大量数据的话,建议将副本数设置为0
去掉mapping中_all域
Index中默认会有_all的域,(相当于solr配置文件中的拷贝字段text),这个会给查询带来方便,但是会增加索引时间和索引尺寸
“_all”:{“enabled”:”false”}
log输出的水平
默认为trace,即查询超过500ms即为慢查询,就要打印日志,造成cpu和mem,io负载很高。
把log输出水平改为info或警告,可以减轻服务器的压力。
修改ES_HOME/conf/logging.yaml文件或者修改ES_HOME/conf/elasticsearch.yaml
使用反射获取ES客户端
可以使用前面讲的方式通过new获取client
使用反射方式:网上反映这种方式效率明显高于new客户端,并可避免线上环境内存溢出和超时等问题
版本一致
在使用java代码操作es集群的时候要保证本地使用的es的版本和集群上es的版本保持一致。
保证集群中每个节点的JDK版本和es配置一致。
分片规则
elasticsearch在建立索引时,根据id或id类型进行hash,得到hash值与该索引的文档数量取余,取余的值即为存入的分片
具体源码为:根据OperationRouting类的shardId方法进行分片
- ElasticSearch搜索集群
- ElasticSearch 搜索集群
- Elasticsearch分布式搜索集群配置
- 分布式搜索elasticsearch集群管理工具head
- 分布式搜索elasticsearch集群监控工具bigdesk
- 分布式搜索elasticsearch集群监控工具bigdesk
- 分布式搜索elasticsearch集群监控工具bigdesk
- 分布式搜索elasticsearch集群管理工具head
- 分布式搜索elasticsearch集群管理工具head
- 分布式搜索elasticsearch集群监控工具bigdesk
- fluentd结合kibana、elasticsearch实时搜索分析hadoop集群日志
- fluentd结合kibana、elasticsearch实时搜索分析hadoop集群日志
- fluentd结合kibana、elasticsearch实时搜索分析hadoop集群日志
- ElasticSearch学习二:构建集群与简单搜索实例应用
- fluentd结合kibana、elasticsearch实时搜索分析hadoop集群日志
- 企业级搜索elasticsearch应用04-集群和常用插件安装
- elasticsearch 集群
- elasticsearch集群
- java网络编程之IOException
- Matlab GUI 基础(2):M文件
- php之zip扩展
- C++ Notes-Inheritance-04
- java开发工程师
- ElasticSearch 搜索集群
- 2016北京网络赛C hihocoder
- java单例设计模式
- Android ActivityManagerService(AMS)的进程管理
- Ajax的学习——get和post请求
- Android 自定义控件 自定义标题栏
- web系统中的资源跳转。
- 如何在VS2010 中创建C语言文件
- jquery的each方法取值ajax传送数组 php取得值