ElasticSearch的使用
在此记录一些常用操作,便于以后回忆。
在文中将ElasticSearch简称为ES
文章目录
一、ES和Kibana的安装
1.ES安装
在此,我使用的是7.6.0版本
https://www.elastic.co/cn/downloads/past-releases#elasticsearch
打开链接找到对应版本下载
解压缩后找到bat启动文件
2.kabana安装
官方建议与ES版本对应,那么我们也下载7.6.0版本的kibana https://www.elastic.co/cn/downloads/past-releases#kibana 打开链接下载,解压缩
语言本地化
kibana-7.6.0\config\kibana.yml
修改内容
启动kibana,注意,需要nodeJs环境。如果没有,请百度自行安装。
二、ES的一些基础操作
1.建立索引,包含字段与字段类型
我们创建了一个索引名为userlist的索引库,默认类型为_doc(可以忽略,新版本已经废弃),包含一下字段。
PUT /userlist
{
"mappings": {
"properties": {
"name":{
"type": "text"
},
"age":{
"type": "integer"
},
"address":{
"type": "text"
},
"sex":{
"type": "text"
}
}
}
}
2.查询索引信息
GET /userlist
3.插入数据
PUT /userlist/_doc/1
{
"name":"小王",
"age":23,
"address":"东城区",
"sex":"男"
}
PUT /userlist/_doc/2
{
"name":"王同学",
"age":25,
"address":"西城区",
"sex":"男"
}
PUT /userlist/_doc/3
{
"name":"王美丽",
"age":19,
"address":"南城区",
"sex":"女"
}
PUT /userlist/_doc/4
{
"name":"王小红",
"age":31,
"address":"北城区",
"sex":"女"
}
PUT /userlist/_doc/5
{
"name":"金成成",
"age":45,
"address":"朝鲜",
"sex":"男"
}
4.修改某一行数据
POST /userlist/_doc/1/_update
{
"doc":{
"name":"小王王"
}
}
5.删除一行数据
DELETE /userlist/_doc/5
6.查询一行数据
GET /userlist/_doc/1
7.基本查询
GET userlist/_doc/_search
{
"query":{
"match":{
"name":"王"
}
}
}
8.查询指定字段
GET userlist/_doc/_search
{
"query":{
"match":{
"name":"王"
}
},
"_source":"name"
}
9.排序查询
GET userlist/_doc/_search
{
"query":{
"match":{
"name":"王"
}
},
"sort":[
{
"age":"asc"
}
],
"_source":["name","age"]
}
10.分页查询
GET userlist/_doc/_search
{
"sort":[
{
"age":"desc"
}
],
"_source":["name","age"],
"from":0,
"size":2
}
11.查询
GET userlist/_doc/_search
{
"query":{
"bool":{
"must":[
{
"match":{
"name":"王"
}
},
{
"match":{
"age":"31"
}
}
]
}
}
}
12.模糊查询 类似mysql or
GET userlist/_doc/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"name": "王"
}
},
{
"match": {
"age": "45"
}
}
]
}
}
}
13.不等于
GET userlist/_doc/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"name": "王"
}
}
]
}
}
}
14.过滤查询
gt大于
gte大于等于
lt小于
lte小于等于
GET userlist/_doc/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "王"
}
}
],
"filter":{
"range":{
"age":{
"gte":30
}
}
}
}
}
}
15.精准查询
GET userlist/_doc/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"age": 25
}
}, {
"term": {
"sex": "男"
}
}
]
}
}
}
三、 集成Springboot进行查询
1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
注意,如果es客户端版本不是7.6.0版本需要指定
<properties>
<elasticsearch.version>7.6.0</elasticsearch.version>
</properties>
2.配置ES
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author
* @Date 2022/4/19 16:58
* @Describe
**/
@Configuration
public class ElasticSearchClientConfig {
@Bean
public RestHighLevelClient restHighLevelClient(){
RestHighLevelClient restHighLevelClient=new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http"))
);
return restHighLevelClient;
}
}
3.操作索引
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
/**
* @Author
* @Date 2022/4/19 16:59
* @Describe
**/
@RestController
public class IndexController {
@Autowired
private RestHighLevelClient restHighLevelClient;
private String index = "userlist";
/**
* 创建索引
*/
@RequestMapping("/insertIndex")
public void insertIndex() throws IOException {
CreateIndexRequest createIndexRequest = new CreateIndexRequest(index);
CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
System.out.println(createIndexResponse.isAcknowledged());
}
/**
* 判断索引是否存在
* @throws IOException
*/
@RequestMapping("/existIndex")
public void existIndex() throws IOException {
GetIndexRequest getIndexRequest = new GetIndexRequest(index);
boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
System.out.println(exists);
}
/**
* 删除索引
* @throws IOException
*/
@RequestMapping("/delIndex")
public void delIndex() throws IOException {
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(index);
AcknowledgedResponse delete = restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
System.out.println(delete.isAcknowledged());
}
}
4.操作文档
import com.alibaba.fastjson.JSON;
import com.inmyshow.vo.HttpMsg;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
import java.util.Date;
import java.util.List;
/**
* @Author ChangJiaNing
* @Date 2022/4/19 17:14
* @Describe
**/
@RestController
public class DocumentController {
@Autowired
private RestHighLevelClient restHighLevelClient;
private String index = "userlist";
/**
* @author
* @date 2022/4/19 17:49
* @Describe 新增文档
**/
@RequestMapping("/addDocument")
public void addDocument() throws IOException {
IndexRequest indexRequest = new IndexRequest(index);
HttpMsg httpMsg = new HttpMsg(200, new Date(), "/baidu/addDocument");
indexRequest.id("1");
indexRequest.timeout("3s");
indexRequest.source(JSON.toJSONString(httpMsg), XContentType.JSON);
IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
System.out.println(indexResponse.toString());
}
/**
* @author
* @date 2022/4/19 17:49
* @Describe 修改文档
**/
@RequestMapping("/updateDocument")
public void updateDocument() throws IOException {
HttpMsg httpMsg = new HttpMsg(500, new Date(), "/baidu/addDocument");
UpdateRequest updateRequest = new UpdateRequest(index, "1");
updateRequest.doc(JSON.toJSONString(httpMsg), XContentType.JSON);
UpdateResponse update = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(update.toString());
}
/**
* @author
* @date 2022/4/19 17:49
* @Describe 删除文档
**/
@RequestMapping("/delDocument")
public void delDocument() throws IOException {
DeleteRequest deleteIndexRequest = new DeleteRequest(index, "1");
DeleteResponse delete = restHighLevelClient.delete(deleteIndexRequest, RequestOptions.DEFAULT);
System.out.println(delete.toString());
}
/**
* @author
* @date 2022/4/19 17:49
* @Describe 批量删除文档
**/
@RequestMapping("/batchAddDocument")
public void batchAddDocument() throws IOException {
BulkRequest bulkRequest = new BulkRequest(index);
for (int i = 1; i < 20; i++) {
HttpMsg httpMsg = new HttpMsg(200, new Date(), "/baidu/addDocument");
IndexRequest indexRequest = new IndexRequest();
indexRequest.id(i + "");
indexRequest.source(JSON.toJSONString(httpMsg), XContentType.JSON);
bulkRequest.add(indexRequest);
}
BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures());
}
/**
* 精准查询
* @param code
* @throws IOException
*/
@RequestMapping("/termQuery/{code}")
public void getDocument1(@PathVariable("code") Integer code) throws IOException {
SearchRequest searchRequest = new SearchRequest(index);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("code", code);
searchSourceBuilder.query(termQueryBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
for (SearchHit documentFields : searchResponse.getHits().getHits()) {
System.out.println("测试查询文档--遍历参数--"+documentFields.getSourceAsMap());
}
}
/**
* 复合多条件查询
* @throws IOException
*/
@RequestMapping("/boolQuery")
public void boolQuery() throws IOException {
SearchRequest searchRequest = new SearchRequest(index);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("code", 500);
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("date").lt(new Date().getTime());
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("url", "baidu");
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.must(termQueryBuilder).must(rangeQueryBuilder).must(matchQueryBuilder);
searchSourceBuilder.query(boolQuery);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
for (SearchHit documentFields : searchResponse.getHits().getHits()) {
System.out.println("测试查询文档--遍历参数--"+documentFields.getSourceAsMap());
}
}
/**
* 聚合统计 统计各个code共有多少个
* @throws IOException
*/
@RequestMapping("/groupCount")
public void groupCount() throws IOException {
SearchRequest searchRequest = new SearchRequest(index);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("group").field("code");
searchSourceBuilder.aggregation(termsAggregationBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Terms group = searchResponse.getAggregations().get("group");
List<? extends Terms.Bucket> groupBuckets = group.getBuckets();
for (Terms.Bucket groupBucket : groupBuckets) {
System.out.println(groupBucket.getKey());
System.out.println(groupBucket.getDocCount());
}
}
}
总结
这些都是一些比较基本的命令,重点在聚合查询,各位工友自行扩展学习吧。