ElasticSearch系列04:核心概念

来源:互联网 发布:券商网络金融部 编辑:程序博客网 时间:2024/05/20 02:56
一、ES配置文件详解
elasticsearch.yml
 es的基本配置文件
 详见elasticsearch中文.yml
logging.yml
 日志配置文件,es也是使用log4j来记录日志的,所以logging.yml里的设置按普通log4j配置来设置就行了。

二、ES中的核心概念
cluster***
代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。
主节点的职责是负责管理集群状态,包括管理分片的状态和副本的状态,以及节点的发现和删除。
只需要在同一个网段之内启动多个es节点,就可以自动组成一个集群。
默认情况下es会自动发现同一网段内的节点,自动组成集群。
集群状态查看
http://192.168.1.170:9200/_cluster/health?pretty

shards*
代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。
可以在创建索引库的时候指定
curl -XPUT 'localhost:9200/test1/' -d'{"settings":{"number_of_shards":3}}'
默认是一个索引库有5个分片
index.number_of_shards: 5

replicas*
代表索引副本,es可以给索引设置副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。
可以在创建索引库的时候指定
curl -XPUT 'localhost:9200/test2/' -d'{"settings":{"number_of_replicas":2}}'
默认是一个分片有1个副本
index.number_of_replicas: 1

recovery *
代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。

gateway*
 代表es索引的持久化存储方式,es默认是先把索引存放到内存中,当内存满了时再持久化到硬盘。当这个es集群关闭再重新启动时就会从gateway中读取索引数据。es支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。

discovery.zen*
 代表es的自动发现节点机制,es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。

如果是不同网段的节点如何组成es集群
禁用自动发现机制
discovery.zen.ping.multicast.enabled: false
设置新节点被启动时能够发现的主节点列表
discovery.zen.ping.unicast.hosts: ["10.11.52.131", "10.11.52.134:9300"]

三、SearchType详解
es的搜索类型有4种
query and fetch(速度最快)(返回N倍数据量)
query then fetch(默认的搜索方式)
DFS query and fetch(可以更精确控制搜索打分和排名。)
DFS query then fetch
DFS解释:见备注
总结一下,从性能考虑QUERY_AND_FETCH是最快的,DFS_QUERY_THEN_FETCH是最慢的。从搜索的准确度来说,DFS要比非DFS的准确度更高。

四、ES查询详解
查询:query
  .setQuery(QueryBuilders.matchQuery("name", "test"))
分页:from/size
  .setFrom(0).setSize(1)
排序:sort
  .addSort("age", SortOrder.DESC)
过滤:filter
  .setPostFilter(FilterBuilders.rangeFilter("age").from(1).to(19))
高亮:highlight

统计:facet(已废弃)使用aggregations 替代
  根据字段进行分组统计
  根据字段分组,统计其他字段的值
  size设置为0,会获取所有数据,否则,只会返回10条。

ES中的分页
与SQL使用LIMIT来控制单“页”数量类似,Elasticsearch使用的是from以及size两个参数:
  size:每次返回多少个结果,默认值为10
  from:从哪条结果开始,默认值为0
假设每页显示5条结果,那么1至3页的请求就是:
  GET /_search?size=5
  GET /_search?size=5&from=5
  GET /_search?size=5&from=10
注意:不要一次请求过多或者页码过大的结果,这么会对服务器造成很大的压力。因为它们会在返回前排序。一个请求会经过多个分片。每个分片都会生成自己的排序结果。然后再进行集中整理,以确保最终结果的正确性。

ES中的timeout
timed_out告诉了我们查询是否超时
curl -XGET http://localhost:9200/_search?timeout=10ms
  es会在10ms之内返回查询内容
注意:timeout并不会终止查询,它只是会在你指定的时间内返回当时已经查询到的数据,然后关闭连接。在后台,其他的查询可能会依旧继续,尽管查询结果已经被返回了。

五、ES的多索引和多类型查询
URL |说明
/_search |搜索所有的索引库和类型中的文档
/megacorp/_search |搜索索引megacorp中的所有类型的文档
/megacorp,beijing/_search |搜索索引megacorp和beijing中的所有类型的文档
/c*,b*/_search |搜索所有以c或b开头的索引中的所有类型的文档
/megacorp/emp/_search |搜索索引megacorp中类型为emp的所有文档
/megacorp,beijing/emp,city/_search |搜索索引megacorp以及beijing中类型为emp和city的所有文档
/_all/emp,city/_search |搜索所有索引中类型为emp以及city内的所有文档

六、ES中文分词集成
elasticsearch官方提供的分词插件,对中文分词效果不是很好
curl 'http://localhost:9200/megacorp/_analyze?pretty=true' -d '{"text":"你好兄弟"}'
集成IK分词工具
1:下载es的IK插件https://github.com/medcl/elasticsearch-analysis-ik
2:使用maven进行编译下载的源码
3:把编译后的target/releases下的elasticsearch-analysis-ik-1.2.9.zip文件拷贝到ES_HOME/plugins/analysis-ik目录下面,然后解压
4:把下载的ik插件中的conf/ik目录拷贝到ES_HOME/config下
5:修改ES_HOME/config/elasticsearch.yml文件,添加index.analysis.analyzer.default.type: ik(把IK设置为默认分词器,这一步是可选的)
6:重启es服务
7:测试分词效果: curl 'http://localhost:9200/megacorp/_analyze?analyzer=ik&pretty=true' -d '{"text":"超人学院"}'

七、ES中的settings和mappings
settings修改索引库默认配置
  例如:分片数量,副本数量
  查看:curl -XGET http://localhost:9200/megacorp/_settings?pretty
  curl -XPUT 'localhost:9200/megacorp/' -d'{"settings":{"number_of_shards":4,"number_of_replicas":0}}'
Mapping,就是对索引库中索引的字段名称及其数据类型进行定义,类似于关系数据库中表建立时要定义字段名及其数据类型那样,(和solr中的schme类似)不过es的mapping比数据库灵活很多,它可以动态添加字段。一般不需要要指定mapping都可以,因为es会自动根据数据格式定义它的类型,如果你需要对某些字段添加特殊属性(如:定义使用其它分词器、是否分词、是否存储等),就必须手动添加mapping
查询索引库的mapping信息
  curl -XGET http://localhost:9200/megacorp/emp/_mapping?pretty
mappings修改字段相关属性
  例如:字段类型,使用哪种分词工具

八、ES中的分片查询方式
默认是randomize across shards
  随机选取,表示随机的从分片中取数据
_local:指查询操作会优先在本地节点有的分片中查询,没有的话再在其它节点查询。
_primary:指查询只在主分片中查询
_primary_first:指查询会先在主分片中查询,如果主分片找不到(挂了),就会在副本中查询。
_only_node:指在指定id的节点里面进行查询,如果该节点只有要dx查询索引的部分分片,就只在这部分分片中查找,所以查询结果可能不完整。如_only_node:123在节点id为123的节点中查询。
_prefer_node:nodeid 优先在指定的节点上执行查询
_shards:0 ,1,2,3,4:查询指定分片的数据
自定义:_only_nodes:根据多个节点进行查询

0 0
原创粉丝点击