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接口

URL 说明 _search 搜索索引 _aliases 操作别名 type 操作类型 _mapping 操作mapping _setting 操作设置 _open 打开索引 _close 关闭索引 _refresh 刷新索引,不保证落地 _flush 刷新索引

ES与关闭型数据库的对比

关系型数据库 ES database index table type row document column field

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节点的选择出现了异常,也就是所谓的脑裂问题。
这样的脑裂状态直接让节点失去了集群的正确状态,导致集群不能正常工作。

脑裂产生的原因

  1. 网络:
    由于是内网通信,网络通信问题造成某些节点认为master死掉,而另选master的可能性较小
  2. 节点负载:
    由于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方法进行分片

0 0
原创粉丝点击