Elasticsearch通过docker安装,并安装kibana进行操作。主要是记录了Elasticsearch常用的指令,查询序列,创建序列,查询数据,对数据分类聚合等。
关于更多的使用,直接看ES的官方文档,文档很详细。
docker pull elasticsearch:7.12.1 docker pull kibana:7.12.1
// 创建外部挂载目录 mkdir -p /mydata/elasticsearch/config 创建目录 mkdir -p /mydata/elasticsearch/data // 设置其他机器可访问 echo "http.host: 0.0.0.0" >/mydata/elasticsearch/config/elasticsearch.yml //将mydata/elasticsearch/文件夹中文件都可读可写--**很重要** chmod -R 777 /mydata/elasticsearch/
// 创建docker容器,单节点启动,设置初始内存大小,挂载外部盘和插件盘,一定要注意文件安家权限问题 docker 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.12.1
docker run -name kibana -e ELASTICSEARCH_HOSTS=http://192.168.6.128:9200 -d kibana:7.12.1
docker update --restart=always elasticsearch docker update --restart=always kibana
【注意】
在安装时有些要注意的地方“
<!--elasticsearch.client--> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.12.1</version> </dependency>
除此之外,Spring boot有维护自己的Elasticsearch版本,这个版本会和我们导入的冲突,所以需要统一版本,这里不多将。就是将spring boot维护的<elasticsearch.version>7.12.1</elasticsearch.version>
改成自己的版本号就可以了。
<!--elasticsearch --> <repository> <id>es-snapshots</id> <name>elasticsearch snapshot repo</name> <url>https://snapshots.elastic.co/maven/</url> </repository>
到这里,Elasticsearch就安装,配置好了。就可以在实际的项目中使用ES了。
这有一个点:
给ES分配多少内存,这个由自己的机器和具体业务而定,机器好,业务存储数据多,就分配大一些。
这里包含了基本的操作,使用的是ES官方提供的测试数据bank.使用的是官方提供的测试数据,建议自己找一下,代码太多,这里放不下。通过批量插入,将官网测试数据插入到ES中,这样才能进行接下来的操作。
GET _search { "query": { "match_all": {} } } # 插入数据 POST /customer/external/_bulk {"index":{"_id":"1"}} {"name":"John Doe"} {"index":{"_id":"2"}} {"name":"John Doe"} # 批量插入数据 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"}} GET bank/_search?q=*&sort=account_number:asc GET bank/_search { "query": { "match_all": {} }, "from": 10, "size": 10, "sort": [ { "account_number": { "order": "desc" } } ], "_source": ["balance","firstname"] } # 自定义查询,这里用的是DSL语法 GET bank/_search { "query": {"match_all": {} }, "from": 0, "size": 5, "sort": [ { "account_number": { "order": "desc" } } ] , "_source": ["balance","account_number", "firstname"] } # 用match,可以模糊查询,通过倒排索引进行查询,全文检索会自动分词进行匹配 GET /bank/_search { "query": { "match": { "address": "kings" } } } # 这里将查询条件当成一个完整的条件,不用分词 GET /bank/_search { "query": { "match_phrase": { "address": "kings" } } } # 这里进行多字段匹配,这里进行了分词查询 GET /bank/_search { "query": { "multi_match": { "query": "mill movice", "fields": ["address", "city"] } } } # 复合查询,bool-must-must_not--shoud , shoud不是必须的 相关性得分 GET /bank/_search { "query": { "bool": { "must": [ {"match": { "gender": "M" } }, {"match": { "address": "mill" } } ], "should": [ { "match": { "lastname": "wallace" } } ], "filter": [ {"range": { "age": { "gte": 18, "lte": 30 } }} ] } } } # filter不会给出相关性得分,should可以给出,一般filter是和shoud联合使用,放到最后过滤结果 GET /bank/_search { "query": { "bool": { "filter": [ { "range": { "age": { "gte": 10, "lte": 20 } } } ] } } } # term使用,term和match一样,精确字段用term,全文查询用match,因为match可以分词,address不适合用term GET /bank/_search { "query": { "term": { "age": 28 } } } # 用match精确某个值,也可用用match_phrase,这个是精确匹配 GET /bank/_search { "query": { "match": { "address.keyword": "789 Madison Street" } } } GET /bank/_search { "query": { "match_phrase": { "address.keyword": "789 Madison Street" } } } # Aggregations模块,这里是一些聚合类型 # 搜索address中包含mill的所有人的年龄分布以及平均年龄,但不显示这些人的详情 # 通过size来设定不看结果,只看分析结果 GET /bank/_search { "query": { "match": { "address": "mill" } }, "aggs": { "ageAgg": { "terms": { "field": "age", "size": 10 } }, "ageAvg": { "avg": { "field": "age" } }, "balanceAvg": { "avg": { "field": "balance" } } }, "size": 0 } //ageAgg:聚合名字 terms:聚合类型 "field": "age":按照age字段聚合 size:10:取出前十种age //avg:平均值聚合类型 //不显示这些人的详情,只看聚合结果 # 按照年龄聚合,并且求这些年龄段的这些人的平均薪资 # 这里测试的是嵌套聚合,语法还是很简单 GET /bank/_search { "query": { "match_all": {} }, "aggs": { "ageAgg": { "terms": { "field": "age", "size": 10 }, "aggs": { "ageAvg": { "avg": { "field": "balance" } } } } } } # 查出所有年龄分布,并且这些年龄段中M的平均薪资和F的平均薪资以及这个年龄段的总体平均薪资,不显示查询结果 GET /bank/_search { "query": { "match_all": {} }, "aggs": { "ageAgg": { "terms": { "field": "age", "size": 10 }, "aggs": { "genderAgg": { "terms": { "field": "gender.keyword", "size": 10 }, "aggs": { "balanceAvg": { "avg": { "field": "balance" } } } } } }, "allBalanceAvg": { "avg": { "field": "balance" } } }, "size": 0 } //"field": "gender.keyword" gender是txt没法聚合 必须加.keyword精确替代 #------------------------------------------应用就是将老的数据迁移到新的索引下----------------------------------------- #------------------------------------需要自定义索引,然后将数据迁移到新的索引----------------------------------------- # mapping 映射,查看属性映射 GET /bank/_mapping # 自定义属性映射, PUT /my_index { "mappings": { "properties": { "age":{"type": "integer" }, "email": {"type": "keyword"}, "name": {"type": "text"} } } } # 修改某个已存在的索引,这里是添加一个,index属性是显示该字段是否被索引到,已经存在映射不能更新的 PUT /my_index/_mapping { "properties": { "employee-id":{ "type": "keyword" , "index": false } } } } # 查看索引 GET /my_index/_mapping # 不能直接更新索引,要更新,只有创建新的索引,将原来的索引的数据迁移到新的索引中来 # 更改映射关系,先创建一个新的索引 PUT /newbank { "mappings": { "properties": { "account_number": { "type": "long" }, "address": { "type": "text" }, "age": { "type": "integer" }, "balance": { "type": "long" }, "city": { "type": "text" }, "email": { "type": "text" }, "employer": { "type": "keyword" }, "firstname": { "type": "text" }, "gender": { "type": "text" }, "lastname": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "state": { "type": "text" } } } } # 查看新的索引 GET /newbank/_mapping # 原来的索引 GET /bank/_mapping # 数据迁移 POST _reindex { "source": { "index": "bank", "type": "account" }, "dest": { "index": "newbank" } } GET /newbank/_search # 新的版本是不用type的