ElasticSearch
概念
倒排索引
由id查询到内容是正排索引
有内容查询id则为倒排索引
把内容分词后和id关联
通过分析过后的内容找到id从而找到整体内容
术语
- Index
文档集合:小写字母 - Document
文档是搜索的最小单位,文档JOSN格式化后保存在ES中
所以对文档的格式没有要求 - 元数据
_index:文档所属的索引名
_type:文档所属的类型名
_id:文档唯—ld
_source: 文档的原始Json数据
_version: 文档的版本号,修改删除操作_version都会自增1
_seq_no: 和_version一样,一旦数据发生更改,数据也一直是累计的。Shard级别严格递增,保证后写入的Doc的_seq_no大于先写入的Doc的_seq_no。
_primary_term: _primary_term主要是用来恢复数据时处理当多个文档的_seq_no一样时的冲突,避免Primary Shard上的写入被覆盖。每当Primary Shard发生重新分配时,比如重启,Primary选举等,_primary_term会递增1
安装
各文件目录结构
- bin
脚本文件,包括启动elasticsearch,安装插件,运行统计数据等 - config
配置文件目录,如elasticsearch配置、角色配置、jvm配置等。 - jdk
java运行环境 - data
默认的数据存放目录,包含节点、分片、索引、文档的所有数据,生产环境需要修改。 - lib
elasticsearch依赖的Java类库 - logs
默认的日志文件存储路径,生产环境需要修改。 - modules
包含所有的Elasticsearch模块,如Cluster、Discovery、Indices等。 - plugins
已安装插件目录
主要配置
- cluster.name
当前节点所属集群名称,多个节点如果要组成同一个集群,那么集群名称一定要配置成相同。默认值elasticsearch,生产环境建议根据ES集群的使用目的修改成合适的名字。 - node.name
当前节点名称,默认值当前节点部署所在机器的主机名,所以如果一台机器上要起多个ES节点的话,需要通过配置该属性明确指定不同的节点名称。 - path.data
配置数据存储目录,比如索引数据等,默认值 $ES_HOME/data,生产环境下强烈建议部署到另外的安全目录,防止ES升级导致数据被误删除。 - path.logs
配置日志存储目录,比如运行日志和集群健康信息等,默认值 $ES_HOME/logs,生产环境下强烈建议部署到另外的安全目录,防止ES升级导致数据被误删除。 - bootstrap.memory_lock
配置ES启动时是否进行内存锁定检查,默认值true。
ES对于内存的需求比较大,一般生产环境建议配置大内存,如果内存不足,容易导致内存交换到磁盘,严重影响ES的性能。所以默认启动时进行相应大小内存的锁定,如果无法锁定则会启动失败。
非生产环境可能机器内存本身就很小,能够供给ES使用的就更小,如果该参数配置为true的话很可能导致无法锁定内存以致ES无法成功启动,此时可以修改为false。 - network.host
配置能够访问当前节点的主机,默认值为当前节点所在机器的本机回环地址127.0.0.1 和[::1],这就导致默认情况下只能通过当前节点所在主机访问当前节点。可以配置为 0.0.0.0 ,表示所有主机均可访问。 - http.port
配置当前ES节点对外提供服务的http端口,默认值 9200 - discovery.seed_hosts
配置参与集群节点发现过程的主机列表,说白一点就是集群中所有节点所在的主机列表,可以是具体的IP地址,也可以是可解析的域名。 - cluster.initial_master_nodes
配置ES集群初始化时参与master选举的节点名称列表,必须与node.name配置的一致。ES集群首次构建完成后,应该将集群中所有节点的配置文件中的cluster.initial_master_nodes配置项移除,重启集群或者将新节点加入某个已存在的集群时切记不要设置该配置项。
操作API
创建索引(index)
#创建索引时可以设置分片数和副本数
PUT /es_db
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 2
}
}
查询索引(index)
#查询索引
GET /es_db
#es_db是否存在
HEAD /es_db
删除索引(index)
DELETE /es_db
ElasticSearch文档操作(Document)
# [PUT/POST] 索引/[_doc/_create]/[id]
# 如果PUT 则必须指定ID操作
# 如果POST id已存在则删除原内容后新增内容版本增加
# 不存在则新增
# 没有指定id则ES自动生成
PUT /es_db/_doc/1
{
body
}
# [PUT/POST] 索引/[_update]/[id]
# 文档必须已经存在,更新只会对相应字段做增量修改
POST /es_db/_update/1
{
body
}
并发修改文档(Document)
# 并发环境下使用乐观锁机制修改文档时
# 要带上当前文档的_seq_no和_primary_term进行更新
# 如果版本号不对,会抛出版本冲突异常
POST /es_db/_doc/2?if_seq_no=21&if_primary_term=6
{
"name": "李四xxx"
}
删除
DELETE /es_db/_doc/1
查询
注: 这里只是使用URI进行检查查询
后续有复杂的组合查询DSL分析
# 根据id查询
GET /es_db/_doc/1
# 条件查询 /索引名称/_doc/_search
GET /es_db/_doc/_search
# 查询age等于28岁
GET /es_db/_doc/_search?q=age:28
# 查询age在25至26岁之间的
GET /es_db/_doc/_search?q=age[25 TO 26]
#查询年龄小于等于28岁的 :<=
GET /es_db/_doc/_search?q=age:<=28
#查询年龄大于28前的 :>
GET /es_db/_doc/_search?q=age:>28
#分页查询 from=*&size=*
GET /es_db/_doc/_search?q=age[25 TO 26]&from=0&size=1
#对查询结果只输出某些字段 _source=字段,字段
GET /es_db/_doc/_search?_source=name,age
#对查询结果排序 sort=字段:desc/asc
GET /es_db/_doc/_search?sort=age:desc