设置集群重新分配的类型,使用 代码登录后可见设置选项。
启用或禁用分片重新分配的类型:
代码登录后可见
查看ES服务端状态:
代码登录后可见
客户端 Kibana
[链接登录后可见]
- 注意:kibana装在计算机本地就好,装服务器会占用大量内存和CPU
kibana启动好后,可以访问 [链接登录后可见]
分词插件安装
将zip压缩包上传到 plugins 目录
代码登录后可见
测试分词:
代码登录后可见
基本概念
关系型数据库 vs ES
- 在7.0之前,一个index可以设置多个Types
- 目前Type已经被Deprecated,7.0开始,一个索引只能创建一个Type - “_doc”
- 传统关系型数据库和ElasticSearch的区别:
- ElasticSearch - Schemaless / 相关性 / 高性能全文检索
- RDMS - 事务性 / Join
注:弱化了之后,表概念上升到index,即一个表对应一个index。
文档(Document)
- ElasticSearch是面向文档的,文档是所有可搜索数据的最小单位。
- 文档会被序列化成JSON格式,保存在ElasticSearch中。
- 每个文档都有唯一ID,可以自己指定也可以由ES自动生成。
- 一篇文档包含了一系列字段,类似数据库表中的一条记录。
- JSON文档,格式灵活,不需要预先定义格式
文档元数据
元数据,用于标注文档的相关信息:
- _index: 文档所属的索引名
- _type: 文档所属的类型名
- _id: 文档的唯一ID
- _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。
并发场景下修改文档
_seq_no和_primary_term是对_version的优化,7.x版本的ES默认使用这种方法控制版本,所以当在高并发环境下使用乐观锁机制修改文档时,要带上当前文档的_seq_no和_primary_term进行更新:
代码登录后可见
如果版本号不对会发生冲突
索引操作
[链接登录后可见]
索引命名必须小写字母,不能以下划线开头
格式:代码登录后可见
代码登录后可见
文档操作
示例数据
代码登录后可见
添加文档
代码登录后可见
- 区别:POST和PUT搭配_doc都能起到创建/更新的作用,PUT需要对一个具体的资源进行操作也就是要确定id才能进行更新/创建,而POST是可以针对整个资源集合进行操作的,如果不写id就由ES生成一个唯一id进行创建新文档,如果填了id那就针对这个id的文档进行创建/更新。
- _create只能创建,如果id存在就会创建失败。
修改文档
如果文档存在,现有文档会被删除,新文档会被索引
update不会删除原来的文档,而是实现真正的数据更新
代码登录后可见
如果更新前后数据没有变化,版本号也不会变化
代码登录后可见
这种方式即使数据没有变化,版本号也会增加
查询文档
代码登录后可见
代码登录后可见
ES Search API提供了两种条件查询搜索方式:
- REST风格的请求URL,直接将参数带过去
- 封装到request body中,这种方式可以定义更加易读的JSON格式
代码登录后可见
删除文档
格式:代码登录后可见
代码登录后可见
批量写入
批量对文档进行写操作是通过_bulk的API来实现的
- 请求方式:POST
- 请求地址:_bulk
- 请求参数:通过_bulk操作文档,一般至少有两行参数(或偶数行参数)
- 第一行参数为指定操作的类型及操作的对象(index,type和id)
- 第二行参数才是操作的数据
参数类似于:
代码登录后可见
- actionName: 表示操作类型,主要有create,index,delete和update
批量创建文档 create
代码登录后可见
普通创建或全量替换 index
代码登录后可见
批量删除 delete
代码登录后可见
批量修改 update
代码登录后可见
四种写入操作可以组合运用
批量读取
ES的批量查询可以使用mget和msearch两种。其中mget是需要我们知道它的id,可以指定不同的index,也可以指定返回值source。msearch可以通过字段查询来进行一个批量的查找。
_mget
代码登录后可见
_msearch
在_msearch中,请求格式和bulk类似。查询一条数据需要两个对象,第一个设置index和type,第二个设置查询语句。查询语句和search相同。如果只是查询一个index,我们可以在url中带上index,这样,如果查该index可以直接用空对象表示。
代码登录后可见
ES高级查询 Query DSL
match 模糊匹配
match在匹配时会对所查找的关键词进行分词,然后按分词匹配查找
match支持以下参数:
代码登录后可见
match_phrase 短语查询
match_phrase查询分析文本并根据分析的文本创建一个短语查询。match_phrase 会将检索关键词分词。match_phrase的分词结果必须在被检索字段的分词中都包含,而且顺序必须相同,而且默认必须都是连续的。
代码登录后可见
multi_match 多字段查询
可以根据字段类型决定是否使用分词查询,得分最高的在前面
代码登录后可见
query_string 字符串查询
允许我们在单个查询字符串中指定AND | OR | NOT条件,同时也和multi_match query一样,支持多字段搜索。和match类似,但是match需要指定字段名,query_string是在所有字段中搜索,范围更广泛。
代码登录后可见
简化版:
代码登录后可见,类似Query String,但是会忽略错误的语法,同时只支持部分查询语法,不支持AND OR NOT,会当作字符串处理。支持部分逻辑:
- + 替代 AND
- | 替代 OR
- - 替代 NOT
代码登录后可见
term 关键词查询
term用来使用关键词查询(精确匹配),还可以用来查询没有被进行分词的数据类型。term是表达语意的最小单位,搜索和利用统计语言模型进行自然语言处理都需要处理term。match在匹配时会对所查找的关键词进行分词,然后按分词匹配查找,而term会直接对关键词进行查找。一般模糊查找的时候,多用match,而精确查找时可以使用term。
- ES中默认使用分词器为标准分词器(Standard Analyzer),标准分词器对于英文单词分词友好,对于中文单字分词每字拆分。
- 在ES的Mapping Type 中 keyword , date ,integer, long , double , boolean or ip这些类型不分词,只有text类型分词。
代码登录后可见
可以通过Constant Score将查询转换成一个Filtering,避免算分,并利用缓存,提高性能。
- 将Query转成 Filter,忽略TF-IDF计算,避免相关性算分的开销
- Filter可以有效利用缓存
代码登录后可见
perfix 前缀搜索
它会对分词后的term进行前缀搜索。
- 它不会分析要搜索字符串,传入的前缀就是想要查找的前缀
- 默认状态下,前缀查询不做相关度分数计算,它只是将所有匹配的文档返回,然后赋予所有相关分数值为1。它的行为更像是一个过滤器而不是查询。两者实际的区别就是过滤器是可以被缓存的,而前缀查询不行。
prefix的原理:需要遍历所有倒排索引,并比较每个term是否已所指定的前缀开头。
代码登录后可见
wildcard 通配符查询
通配符查询:工作原理和prefix相同,只不过它不是只比较开头,它能支持更为复杂的匹配模式。
代码登录后可见
range 范围查询
- gte 大于等于
- lte 小于等于
- gt 大于
- lt 小于
- now 当前时间
代码登录后可见
ids 多ID查询
代码登录后可见
fuzzy 模糊查询
在实际的搜索中,我们有时候会打错字,从而导致搜索不到。在ElasticSearch中,我们可以使用fuzziness属性来进行模糊查询,从而达到搜索有错别字的情形。
fuzzy查询会用到两个很重要的参数,fuzziness,prefix_length
代码登录后可见
注意:fuzzy 模糊查询最大模糊错误必须在0-2之间
- 搜索关键词长度为2,不允许存在模糊
- 搜索关键词长度为3-5,允许1次模糊
- 搜索关键词长度大于5,允许最大2次模糊