四.核心类型(Core datatype)
- 字符串:string,string类型包含 text 和 keyword。
- text:该类型被用来索引长文本,在创建索引前会将这些文本进行分词,转化为词的组合,建立索引;允许es来检索这些词,text类型不能用来排序和聚合。
- keyword:该类型不能分词,可以被用来检索过滤、排序和聚合,keyword类型不可用text进行分词模糊检索。
- 数值型:long、integer、short、byte、double、float
- 日期型:date
- 布尔型:boolean
五.keyword 与 text 映射类型的区别
将 book 字段设置为 keyword 映射 (只能精准查询, 不能分词查询,能聚合、
排序)
POST /es_db/_doc/_search { "query": { "term": { "book": "elasticSearch入门至精通" } } } # 返回数据 #! Deprecation: [types removal] Specifying types in search requests is deprecated. { "took" : 1, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 0, "relation" : "eq" }, "max_score" : null, "hits" : [ ] } }
将 book 字段设置为 text 映射能模糊查询, 能分词查询,不能聚合、排序)
POST /es_db/_doc/_search { "query": { "match": { "book": "elasticSearch入门至精通" } } } # 返回数据 #! Deprecation: [types removal] Specifying types in search requests is deprecated. { "took" : 12, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 1.7260926, "hits" : [ { "_index" : "es_db", "_type" : "_doc", "_id" : "1", "_score" : 1.7260926, "_source" : { "name" : "Jack", "sex" : 1, "age" : 25, "book" : "elasticSearch入门至精通", "address" : "广州车陂" } } ] } }
六.创建静态映射时指定text类型的ik分词器
1.设置ik分词器的文档映射
先删除之前的es_db
再创建新的es_db
定义ik_smart的映射
PUT /es_db { "mappings":{ "properties":{ "name":{"type":"keyword","index":true,"store":true}, "sex":{"type":"integer","index":true,"store":true}, "age":{"type":"integer","index":true,"store":true}, "book":{"type":"text","index":true,"store":true,"analyzer":"ik_smart","search_analyzer":"ik_smart"}, "address":{"type":"text","index":true,"store":true} } } } # 返回 { "acknowledged" : true, "shards_acknowledged" : true, "index" : "es_db" }
2.分词查询
POST /es_db/_doc/_search {"query": { "match": {"address": "广"} } } # 返回 #! Deprecation: [types removal] Specifying types in search requests is deprecated. { "took" : 81, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 0, "relation" : "eq" }, "max_score" : null, "hits" : [ ] } } POST /es_db/_doc/_search { "query": { "match": {"address": "广州"} } } # 返回 #! Deprecation: [types removal] Specifying types in search requests is deprecated. { "took" : 81, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 0, "relation" : "eq" }, "max_score" : null, "hits" : [ ] } }
七.对已存在的mapping映射进行修改
具体方法
1)如果要推倒现有的映射, 你得重新建立一个静态索引
2)然后把之前索引里的数据导入到新的索引里
3)删除原创建的索引
4)为新索引起个别名, 为原索引名
PUT /db_index POST _reindex { "source": { "index": "db_index" }, "dest": { "index": "db_index_2" } } DELETE /db_index PUT /db_index_2/_alias/db_index
注意: 通过这几个步骤就实现了索引的平滑过渡,并且是零停机
八.Elasticsearch乐观并发控制
在数据库领域中,有两种方法来确保并发更新,不会丢失数据:
1、悲观并发控制
这种方法被关系型数据库广泛使用,它假定有变更冲突可能发生,因此阻塞访问
资源以防止冲突。 一个典型的例子是读取一行数据之前先将其锁住,确保只有放
置锁的线程能够对这行数据进行修改。
2、乐观并发控制
Elasticsearch 中使用的这种方法假定冲突是不可能发生的,并且不会阻塞正在
尝试的操作。 然而,如果源数据在读写当中被修改,更新将会失败。应用程序接
下来将决定该如何解决冲突。 例如,可以重试更新、使用新的数据、或者将相关
情况报告给用户。
3、再以创建一个文档为例 ES老版本
PUT /db_index/_doc/1 { "name": "Jack", "sex": 1, "age": 25, "book": "Spring Boot 入门到精通", "remark": "hello world" }
4、实现_version乐观锁更新文档
备注:es 7.x 不支持该关键字
PUT /db_index/_doc/1?version=1 { "name": "Jack", "sex": 1, "age": 25, "book": "Spring Boot 入门到精通", "remark": "hello world" } # 返回 { "error" : { "root_cause" : [ { "type" : "action_request_validation_exception", "reason" : "Validation Failed: 1: internal versioning can not be used for optimistic concurrency control. Please use `if_seq_no` and `if_primary_term` instead;" } ], "type" : "action_request_validation_exception", "reason" : "Validation Failed: 1: internal versioning can not be used for optimistic concurrency control. Please use `if_seq_no` and `if_primary_term` instead;" }, "status" : 400 }
5、ES新版本不使用version进行并发版本控制
if_seq_no=版本值
- &if_primary_term=文档位置
- _seq_no:文档版本号,作用同_version
- _primary_term:文档所在位置
POST /my_doc/_search DELETE /my_doc POST /my_doc/_doc/1 { "id": 1, "name": "关羽", "desc": "千里走单骑", "create_date": "2021‐02‐24" } POST /my_doc/_update/1 { "doc": { "name": "关羽1" } } # if_seq_no 是版本号的意思,一个版本号只能被使用一次 POST /my_doc/_update/1/?if_seq_no=1&if_primary_term=1 { "doc": { "name": "关羽1" } } POST /my_doc/_update/1/?if_seq_no=2&if_primary_term=1 { "doc": { "name": "关羽2" } }
九.Java API操作ES
后续独立文章讲解
十.ES集群环境搭建
1.将安装包分发到其他服务器上面
2.修改elasticsearch.yml
node1.hxl.cn 服务器使用hxl用户来修改配置文件
mkdir ‐p /usr/local/es/elasticsearch‐7.10.1/log mkdir ‐p /usr/local/es/elasticsearch‐7.10.1/data cd /usr/local/es/elasticsearch‐7.10.1/config rm ‐rf elasticsearch.yml vim elasticsearch.yml cluster.name: hxl‐es node.name: node1.hxl.cn path.data: /usr/local/es/elasticsearch‐7.10.1/data path.logs: /usr/local/es/elasticsearch‐7.10.1/log network.host: node1.hxl.cn http.port: 9200 discovery.seed_hosts: ["IP1", "IP2", "IP3"] cluster.initial_master_nodes: ["节点1名称", "节点2名称", "节点3名称"] bootstrap.system_call_filter: false bootstrap.memory_lock: false http.cors.enabled: true http.cors.allow‐origin: "*"
3.修改jvm.option
修改jvm.option配置文件,调整jvm堆内存大小
node1.hxl.cn使用hxl用户执行以下命令调整jvm堆内存大小,每个人根据自
己服务器的内存大小来进行调整。
cd /usr/local/es/elasticsearch‐7.10.1/config vim jvm.options ‐Xms2g ‐Xmx2g
4.node2与node3修改es配置文件
node2.hxl.cn与node3.hxl.cn也需要修改es配置文件
node2.hxl.cn使用hxl用户执行以下命令修改es配置文件
mkdir ‐p /usr/local/es/elasticsearch‐7.10.1/log mkdir ‐p /usr/local/es/elasticsearch‐7.10.1/data cd /usr/local/es/elasticsearch‐7.10.1/config vim elasticsearch.yml cluster.name: hxl‐es node.name: node2.hxl.cn path.data: /usr/local/es/elasticsearch‐7.10.1/data path.logs: /usr/local/es/elasticsearch‐7.10.1/log network.host: node2.hxl.cn http.port: 9200 discovery.seed_hosts: ["IP1", "IP2", "IP3"] cluster.initial_master_nodes: ["节点1名称", "节点2名称", "节点3名称"] bootstrap.system_call_filter: false bootstrap.memory_lock: false http.cors.enabled: true http.cors.allow‐origin: "*"
node3.hxl.cn使用hxl用户执行以下命令修改配置文件
mkdir ‐p /usr/local/es/elasticsearch‐7.10.1/log mkdir ‐p /usr/local/es/elasticsearch‐7.10.1/data cd /usr/local/es/elasticsearch‐7.10.1/config vim elasticsearch.yml cluster.name: hxl‐es node.name: node3.hxl.cn10 path.data: /usr/local/es/elasticsearch‐7.10.1/data path.logs: /usr/local/es/elasticsearch‐7.10.1/log network.host: node3.hxl.cn http.port: 9200 discovery.seed_hosts: ["IP1", "IP2", "IP3"] cluster.initial_master_nodes: ["节点1名称", "节点2名称", "节点3名称"] bootstrap.system_call_filter: false bootstrap.memory_lock: false http.cors.enabled: true http.cors.allow‐origin: "*"
查看集群状态:
GET _cat/nodes?v GET _cat/health?v
十一.Elasticsearch-head插件
由于es服务启动之后,访问界面比较丑陋,为了更好的查看索引库当中的信息,
我们可以通过安装elasticsearch-head这个插件来实现,这个插件可以更方便快
捷的看到es的管理界面
elasticsearch-head这个插件是es提供的一个用于图形化界面查看的一个插件工
具,可以安装上这个插件之后,通过这个插件来实现我们通过浏览器查看es当中
的数据
安装elasticsearch-head这个插件这里提供两种方式进行安装,第一种方式就是
自己下载源码包进行编译,耗时比较长,网络较差的情况下,基本上不可能安装
成功。
第二种方式就是直接使用我已经编译好的安装包,进行修改配置即可
要安装elasticsearch-head插件,需要先安装Node.js
1 安装nodejs
Node.js是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
Node.js是一个Javascript运行环境(runtime environment),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。Node.js 不是一个 JavaScript 框架,不同于CakePHP、Django、Rails。Node.js 更不是浏览器端的库,不能与 jQuery、ExtJS 相提并论。Node.js 是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与 PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。
1.1 下载安装包
node1.hxl.cn机器执行以下命令下载安装包,然后进行解压
cd /usr/local/es wget https://npm.taobao.org/mirrors/node/v8.1.0/node‐v8.1.0‐linux‐ x64.tar.gz tar ‐zxvf node‐v8.1.0‐linux‐x64.tar.gz ‐C /usr/local/es/
1.2 创建软连接
node1.hxl.cn执行以下命令创建软连接
sudo ln ‐s /usr/local/es/node‐v8.1.0‐linux‐x64/lib/node_modules/npm/bin/np m‐cli.js /usr/local/bin/npm sudo ln ‐s /usr/local/es/node‐v8.1.0‐linux‐x64/bin/node /usr/local/bin/nod e
1.3 修改环境变量
node1.hxl.cn服务器添加环境变量
vi /etc/profile export NODE_HOME=/usr/local/es/node‐v8.1.0‐linux‐x64 export PATH=:$PATH:$NODE_HOME/bin
修改完环境变量使用source生效
source /etc/profile
1.4 验证安装成功
node1.hxl.cn执行以下命令验证安装生效
node ‐v npm ‐v
2 本地安装
2.1 上传压缩包到/usr/local/es路径下去
将我们的压缩包 elasticsearch-head-compile-after.tar.gz 上传到服务器
的/usr/local/es 路径下面去
2.2 解压安装包
在服务器中执行以下命令解压安装包
cd /usr/local/es/ tar ‐zxvf elasticsearch‐head‐compile‐after.tar.gz ‐C /usr/local/es/
2.3 node1.hxl.cn机器修改Gruntfile.js
修改Gruntfile.js这个文件
cd /usr/local/es/elasticsearch‐head vim Gruntfile.js
找到代码中的93行:hostname: '192.168.100.100', 修改为:node1.hxl.cn
connect: { server: { options: { hostname: 'node1.hxl.cn', port: 9100, base: '.', keepalive: true } } }
2.4 node1机器修改app.js
第一台机器修改app.js
cd /usr/local/es/elasticsearch‐head/_site vim app.js #在Vim中输入「:4354」,定位到第4354行, #修改 http://localhost:9200为 http://node1.hxl.cn:9200
2.5 启动head服务
node1.hxl.cn启动elasticsearch-head插件
cd /usr/local/es/elasticsearch‐head/node_modules/grunt/bin/进程前台启动命令 ./grunt server
进程后台启动命令
nohup ./grunt server >/dev/null 2>&1 & Running "connect:server" (connect) taskWaiting forever...Started connect web server on http://192.168.52.100:9100 # 如何停止:elasticsearch‐head进程 # 执行以下命令找到elasticsearch‐head的插件进程,然后使用kill ‐9 杀死进程即可 netstat ‐nltp | grep 9100 kill ‐9 8328
2.6 访问elasticsearch-head界面
打开Google Chrome访问
注意:搭建es集群,启动三个es节点,访问elasticsearch-head时只显示一个
master
解决方案:进到节点2、3的/elasticsearch-7.6.1/data/目录下删除nodes文件,
之后重启节点2、3的es进程即可