mysql作为数据持久化,ElasticSearch提供检索功能
基本概念
在ES中,数据是以json格式存储的
ES模型
ES的工作原理
倒排索引
将要保存的数据data进行分词后保存到一个【分词-索引】表中,并且一直维护这个表。当需要检索特定数据时,就可以快速的根据这张表返回相应数据。
二、安装ES使用docker容器安装
1、elasticsearch=>mysql kibana=》navicate
docker pull elasticsearch:7.4.2docker pull kibana:7.4.2版本要统一
2、配置挂载目录等等
# 将docker里的目录挂载到linux的/mydata目录中# 修改/mydata就可以改掉docker里的mkdir -p /mydata/elasticsearch/configmkdir -p /mydata/elasticsearch/data#查看系统当前内存使用情况free -m # es可以被远程任何机器访问echo "http.host: 0.0.0.0" >/mydata/elasticsearch/config/elasticsearch.yml#查询docker日志docker logs [容器id]# 递归更改es目录权限,否则访问失败chmod -R 777 /mydata/elasticsearch/#启动Elastic search# 9200是用户交互端口 9300是集群心跳端口# -e指定是单阶段运行# -e指定占用的内存大小,生产时可以设置32Gdocker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.4.2
2、配置挂载目录等等
#查看当前虚拟机的ip地址ifconfig#启动kibana:sudo docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.56.10:9200 -p 5601:5601 -d kibana:7.4.2
三、初步检索 1、检索es信息 2、新增文档查看Linuxip地址的方法
ifconfigip addrhostname -I
post/put 必须指定索引跟类型
put时:必须指定id,第一次状态为created 以后为updated
post时:如果指定id,与put作用相同;
如果不指定id,那么会自动生成随机id,并且状态永远都是created
发送的参数为json格式
3、查看文档&乐观锁GET /索引名/类型名/文档id
乐观锁用法
增加if_seq_no=xxx&if_primary_term=xxx参数
当seq_no匹配的时候才会修改 否则不会修改
模拟这个操作
1、查看id=6的文档,得到seq_no和primary_trem
2、有两个请求查到了这条记录 并且想修改
假设1号修改先发出
由于seq_no已经改变 所有2号修改失败
{ "error": { "root_cause": [ { "type": "version_conflict_engine_exception", "reason": "[6]: version conflict, required seqNo [12], primary term [1]、current document has seqNo [13] and primary term [1]", "index_uuid": "PfpeoFkmRwms3i8hpOj5IQ", "shard": "0", "index": "customer" } ], "type": "version_conflict_engine_exception", "reason": "[6]: version conflict, required seqNo [12], primary term [1]、current document has seqNo [13] and primary term [1]", "index_uuid": "PfpeoFkmRwms3i8hpOj5IQ", "shard": "0", "index": "customer" }, "status": 409}
如果2号修改想要成功,必须重新获取seq_no
4、更新文档前面创建的时候介绍了两种方法,还有另一种方法
POST /索引名/类型名/id/_update
{ "doc":{ "name":"111" }}
与之前两种方法的区别:会将当前数据和发来的参数进行对比,如果相同,那就什么都不做。
5、删除文档或者索引不能删除类型
DELETE customer/external/1DELETE customer
删除文档后,查询:“found”:false
批量操作–bulkPOST /索引/分类/_bulk
两行为一个整体{"index":{"_id":"1"}}{"name":"a"}{"index":{"_id":"2"}}{"name":"b"}注意格式json和text均不可,要去kibana里Dev Tools {action:{metadata}}n{request body }n{action:{metadata}}n{request body }n
不同于数据库的事务,某一条执行失败是,其它该成功的也会成功
POST /_bulk
对整个索引执行操作,因为没有在url中指定索引和分类,所以需要在requestbody中指定,"_index"和"_type"等等
POST /_bulk{"delete":{"_index":"website","_type":"blog","_id":"123"}}{"create":{"_index":"website","_type":"blog","_id":"123"}}{"title":"my first blog post"}{"index":{"_index":"website","_type":"blog"}}{"title":"my second blog post"}{"update":{"_index":"website","_type":"blog","_id":"123"}}{"doc":{"title":"my updated blog post"}}
测试样本数据模板:
POST /bank/account/_bulk
https://gitee.com/xlh_blog/common_content/blob/master/es%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE.json
{"account_number": 1,"balance": 39225,"firstname": "Amber","lastname": "Duke","age": 32,"gender": "M","address": "880 Holmes Lane","employer": "Pyrami","email": "amberduke@pyrami.com","city": "Brogan","state": "IL"}