elasticsearch学习笔记

1、elacticSearch基本操作

1 创建索引

put:http://localhost:9200/shopping

创建shopping索引 具有幂等性,不能用POST请求

2 查询所有的索引

get:http://localhost:9200/_cat/indices?v

3 删除索引

delete:http://localhost:9200/shopping

4 添加数据(文档)

1)随机生成ID

post:http://localhost:9200/shopping/_doc

post请求,需要增加json格式的请求体

{
	"title":"小米手机",
	"category":"小米",
	"images":"http://www.xiaomi.com/images",
	"price":3999.00
}
2)指定id

post:http://localhost:9200/shopping/_create/1001

post:http://localhost:9200/shopping/_doc/2001

{
	"title":"小米手机",
	"category":"小米",
	"images":"http://www.xiaomi.com/images",
	"price":3999.00
}
1001就是指定的ID

5 主键查询

get:http://localhost:9200/shopping/_doc/1001

返回结果

{
    "_index": "shopping",
    "_type": "_doc",
    "_id": "1001",
    "_version": 1,
    "_seq_no": 3,
    "_primary_term": 1,
    "found": true,
    "_source": {
        "title": "小米手机",
        "category": "小米",
        "images": "http://www.xiaomi.com/images",
        "price": 3999
    }
}

查询不到数据的情况

{
    "_index": "shopping",
    "_type": "_doc",
    "_id": "2001",
    "found": false
}

6 查询所有数据

get:http://localhost:9200/shopping/_search

返回数据

{
    "took": 392,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 4,
            "relation": "eq"
        },
        "max_score": 1,
        "hits": [
            {
                "_index": "shopping",
                "_type": "_doc",
                "_id": "IZuUtnkBzbel_T_mg9ZP",
                "_score": 1,
                "_source": {
                    "title": "小米手机",
                    "category": "小米",
                    "images": "http://www.xiaomi.com/images",
                    "price": 3999
                }
            },
            {
                "_index": "shopping",
                "_type": "_doc",
                "_id": "IpuUtnkBzbel_T_mq9ar",
                "_score": 1,
                "_source": {
                    "title": "小米手机",
                    "category": "小米",
                    "images": "http://www.xiaomi.com/images",
                    "price": 3999
                }
            },
            {
                "_index": "shopping",
                "_type": "_doc",
                "_id": "I5uUtnkBzbel_T_mstYg",
                "_score": 1,
                "_source": {
                    "title": "小米手机",
                    "category": "小米",
                    "images": "http://www.xiaomi.com/images",
                    "price": 3999
                }
            },
            {
                "_index": "shopping",
                "_type": "_doc",
                "_id": "1001",
                "_score": 1,
                "_source": {
                    "title": "小米手机",
                    "category": "小米",
                    "images": "http://www.xiaomi.com/images",
                    "price": 3999
                }
            }
        ]
    }
}

7 修改数据(全量数据更新)

由于修改数据具有幂等性,选择put请求,请求地址跟新增类似

PUT:http://localhost:9200/shopping/_doc/1001

body中添加修改内容

{
	"title":"小米手机",
	"category":"小米",
	"images":"http://www.xiaomi.com/images",
	"price":4999.00
}

7 局部数据更新

不具备幂等性,不能采用put请求,发送post请求

post:http://localhost:9200/shopping/_update/2001

body中添加需要修改的内容

{
	"doc":{
		"title":"华为手机"
	}
}

8 删除数据

delete:http://localhost:9200/shopping/_doc/2001

2.ElasticSearch简单条件查询

1 匹配查询

  1. URL传参形式

get:http://localhost:9200/shopping/_search?q=title:小米手机

2)带请求体的传参形式

由于URL中文传输问题,一般推荐采用请求体的形式

get:http://localhost:9200/shopping/_search

添加请求体

{
	"query":{
		"match":{
			"title":"小米手机"
		}
	}
}

2 全部匹配查询

get:http://localhost:9200/shopping/_search

{
	"query":{
		"match_all":{
		}
	}
}

3 分页查询

get:http://localhost:9200/shopping/_search

{
	"query":{
		"match_all":{
		}
	},
	"from":6,
	"size":2
}

from:起始数据的索引,并非指的是起始页

​ 计算公式(页码-1)*每页数据条数

size:每页数据条数

4 筛选查询出来的内容

get:http://localhost:9200/shopping/_search

{
	"query":{
		"match_all":{
		}
	},
	"from":6,
	"size":2,
	"_source":["title"]
}

5 查询排序

get:http://localhost:9200/shopping/_search

{
	"query":{
		"match_all":{
		}
	},
	"_source":["title","price"],
	"sort":{
		"price":{
			"order":"asc"
		}
	}
}

sort:排序

price:排序字段

order:排序规则(升序asc、降序desc)

3 多条件查询、复杂查询

1 多条件查询

get:http://localhost:9200/shopping/_search

1)查询category="小米"并且price=1999

{
	"query":{
		"bool":{
			"must":[
				{
					"match":{
						"category":"小米"
					}
				},
				{
					"match":{
						"price":1999
					}
				}
			]
		}
	}
}

2)查询查询category="小米"或者category="华为"

{
	"query":{
		"bool":{
			"should":[
				{
					"match":{
						"category":"小米"
					}
				},
				{
					"match":{
						"category":"华为"
					}
				}
			]
		}
	}
}

must:是取交集,相当于sql中的and,必须满足categort=小米和price=1999,如果想使用类似sql中的or操作,需要将must改为shoule

shoule:相当于sql中的or操作,取并集

2 范围查询

{
	"query":{
		"bool":{
			"should":[
				{
					"match":{
						"category":"小米"
					}
				},
				{
					"match":{
						"category":"华为"
					}
				}
			],
			"filter":{
				"range":{
					"price":{
						"gt":5000
					}
				}
			}
		}
	}
}

范围查询,主要是增加filter

3 全文检索

全文检索指的是我们在保存文档的时候,es会将数据文字进行分词拆解操作,并将拆解后的数据保存到倒排索引当中,这样即使使用文字的一部分也能查到数据,这种检索方式我们称之为全文检索,es会将查询内容进行分词,在倒排索引中进行匹配,每个拆解后的文字都可以进行匹配。

{
	"query":{
		"match":{
			"category":"米"
		}
	}
}

如上所示,当查询内容为"米"时,会将所有的"小米"数据查询出来

{
	"query":{
		"match":{
			"category":"小华"
		}
	}
}

如上所示,当查询“小华”时,ES会将查询内容拆分为“小”和“华”,这样检索出来的内容是既有“小米”,又有“华为”。

4 完全匹配

当全文检索不适用于业务场景的时候,比如我只想查找品牌是“小华”的数据,可以采用完全匹配的模式,将"match"改为"match_phrase",这样我们在使用ES进行检索的时候,就不会把“小华”进行分词拆分。

{
	"query":{
		"match_phrase":{
			"category":"小华"
		}
	}
}

5 高亮显示

对指定字段进行高亮显示

增加"highlight"

{
	"query":{
		"match":{
			"category":"小米"
		}
	},
	"highlight":{
		"fields":{
			"category":{}
		}
	}
}

6 聚合查询

1、分组聚合
{
	"aggs":{//聚合操作
		"price_group":{//名称:随意起名
			"terms":{//分组
				"field":"price"//分组字段
			}
		}
	},
	"size":0//不显示原始数据,只显示分组数据
}
2、求平均值
{
	"aggs":{//聚合操作
		"price_avg":{//名称:随意起名
			"avg":{//平均值
				"field":"price"//分组字段
			}
		}
	},
	"size":0//不显示原始数据,只显示分组数据
}

7 映射关系

在采用ES的时候,有些字段是允许全文检索,有些字段是全部匹配的,还有一些字段是不需要索引的,这就需要我们增加映射关系

先创建索引

put:http://localhost:9200/user

put:http://localhost:9200/user/_mapping

{
	"properties":{
		"name":{
			"type":"text",//text表示文本,可以分词
			"index":true//表示建立索引
		},
		"sex":{
			"type":"keyword",//keyword表示不需要分词
			"index":true
		},
		"tel":{
			"type":"keyword",
			"index":false//false表示不建立索引
		}
		
	}
}

映射关系建立之后添加数据

post:http://localhost:9200/user/_doc

{
	"name":"红米",
	"sex":"女的",
	"tel":1111
}

这样在查询的时候,name字段可以采用全文检索,并且有索引,sex字段只能全部匹配,tel字段没有索引,不能查询

{
    "query":{
        "match":{
            "name":"米"
        }
    }
}

4 javaAPI调用

1)创建索引

public static void main(String[] args) throws Exception {

        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 创建索引
        CreateIndexRequest request = new CreateIndexRequest("user");
        CreateIndexResponse createIndexResponse =
                esClient.indices().create(request, RequestOptions.DEFAULT);

        // 响应状态
        boolean acknowledged = createIndexResponse.isAcknowledged();
        System.out.println("索引操作 :" + acknowledged);

        esClient.close();
    }

2)删除索引

public static void main(String[] args) throws Exception {

        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 查询索引
        DeleteIndexRequest request = new DeleteIndexRequest("user");

        AcknowledgedResponse response = esClient.indices().delete(request, RequestOptions.DEFAULT);

        // 响应状态
        System.out.println(response.isAcknowledged());

        esClient.close();
    }

3)查询索引

public static void main(String[] args) throws Exception {

        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 查询索引
        GetIndexRequest request = new GetIndexRequest("user");

        GetIndexResponse getIndexResponse =
                esClient.indices().get(request, RequestOptions.DEFAULT);

        // 响应状态
        System.out.println(getIndexResponse.getAliases());
        System.out.println(getIndexResponse.getMappings());
        System.out.println(getIndexResponse.getSettings());

        esClient.close();
    }

4) 文档保存

public static void main(String[] args) throws Exception {

        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 插入数据
        IndexRequest request = new IndexRequest();
        request.index("user").id("1001");

        User user = new User();
        user.setName("zhangsan");
        user.setAge(30);
        user.setSex("男");

        // 向ES插入数据,必须将数据转换位JSON格式
        ObjectMapper mapper = new ObjectMapper();
        String userJson = mapper.writeValueAsString(user);
        request.source(userJson, XContentType.JSON);

        IndexResponse response = esClient.index(request, RequestOptions.DEFAULT);

        System.out.println(response.getResult());

        esClient.close();
    }

5) 文档批量新增

public static void main(String[] args) throws Exception {

        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 批量插入数据
        BulkRequest request = new BulkRequest();

//        request.add(new IndexRequest().index("user").id("1001").source(XContentType.JSON, "name", "zhangsan", "age",30,"sex","男"));
//        request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name", "lisi", "age",30,"sex","女"));
//        request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON, "name", "wangwu", "age",40,"sex","男"));
//        request.add(new IndexRequest().index("user").id("1004").source(XContentType.JSON, "name", "wangwu1", "age",40,"sex","女"));
//        request.add(new IndexRequest().index("user").id("1005").source(XContentType.JSON, "name", "wangwu2", "age",50,"sex","男"));
//        request.add(new IndexRequest().index("user").id("1006").source(XContentType.JSON, "name", "wangwu3", "age",50,"sex","男"));
        //request.add(new IndexRequest().index("user").id("1007").source(XContentType.JSON, "name", "wangwu44", "age",60,"sex","男"));
        //request.add(new IndexRequest().index("user").id("1008").source(XContentType.JSON, "name", "wangwu555", "age",60,"sex","男"));
        request.add(new IndexRequest().index("user").id("1009").source(XContentType.JSON, "name", "wangwu66666", "age",60,"sex","男"));

        BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
        System.out.println(response.getTook());
        System.out.println(response.getItems());

        esClient.close();
    }

6) 文档删除

public static void main(String[] args) throws Exception {

        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );


        DeleteRequest request = new DeleteRequest();
        request.index("user").id("1001");

        DeleteResponse response = esClient.delete(request, RequestOptions.DEFAULT);
        System.out.println(response.toString());

        esClient.close();
    }

7) 文档批量删除

public static void main(String[] args) throws Exception {

        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 批量删除数据
        BulkRequest request = new BulkRequest();

        request.add(new DeleteRequest().index("user").id("1001"));
        request.add(new DeleteRequest().index("user").id("1002"));
        request.add(new DeleteRequest().index("user").id("1003"));

        BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
        System.out.println(response.getTook());
        System.out.println(response.getItems());

        esClient.close();
    }

8) 文档查询

public static void main(String[] args) throws Exception {

        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 查询数据
        GetRequest request = new GetRequest();
        request.index("user").id("1001");
        GetResponse response = esClient.get(request, RequestOptions.DEFAULT);

        System.out.println(response.getSourceAsString());

        esClient.close();
    }

9) 文档更新

public static void main(String[] args) throws Exception {

        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 修改数据
        UpdateRequest request = new UpdateRequest();
        request.index("user").id("1001");
        request.doc(XContentType.JSON, "sex", "女");

        UpdateResponse response = esClient.update(request, RequestOptions.DEFAULT);

        System.out.println(response.getResult());

        esClient.close();
    }

10 文档高级查询

public static void main(String[] args) throws Exception {

        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 1. 查询索引中全部的数据
//        SearchRequest request = new SearchRequest();
//        request.indices("user");
//
//        request.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));
//
//        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
//
//        SearchHits hits = response.getHits();
//
//        System.out.println(hits.getTotalHits());
//        System.out.println(response.getTook());
//
//        for ( SearchHit hit : hits ) {
//            System.out.println(hit.getSourceAsString());
//        }

        // 2. 条件查询 : termQuery
//        SearchRequest request = new SearchRequest();
//        request.indices("user");
//
//        request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("age", 30)));
//        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
//
//        SearchHits hits = response.getHits();
//
//        System.out.println(hits.getTotalHits());
//        System.out.println(response.getTook());
//
//        for ( SearchHit hit : hits ) {
//            System.out.println(hit.getSourceAsString());
//        }

        // 3. 分页查询
//        SearchRequest request = new SearchRequest();
//        request.indices("user");
//
//        SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
//        // (当前页码-1)*每页显示数据条数
//        builder.from(2);
//        builder.size(2);
//        request.source(builder);
//        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
//
//        SearchHits hits = response.getHits();
//
//        System.out.println(hits.getTotalHits());
//        System.out.println(response.getTook());
//
//        for ( SearchHit hit : hits ) {
//            System.out.println(hit.getSourceAsString());
//        }

//        // 4. 查询排序
//        SearchRequest request = new SearchRequest();
//        request.indices("user");
//
//        SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
//        //
//        builder.sort("age", SortOrder.DESC);
//
//        request.source(builder);
//        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
//
//        SearchHits hits = response.getHits();
//
//        System.out.println(hits.getTotalHits());
//        System.out.println(response.getTook());
//
//        for ( SearchHit hit : hits ) {
//            System.out.println(hit.getSourceAsString());
//        }

//        // 5. 过滤字段
//        SearchRequest request = new SearchRequest();
//        request.indices("user");
//
//        SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
//        //
//        String[] excludes = {"age"};
//        String[] includes = {};
//        builder.fetchSource(includes, excludes);
//
//        request.source(builder);
//        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
//
//        SearchHits hits = response.getHits();
//
//        System.out.println(hits.getTotalHits());
//        System.out.println(response.getTook());
//
//        for ( SearchHit hit : hits ) {
//            System.out.println(hit.getSourceAsString());
//        }

//        // 6. 组合查询
//        SearchRequest request = new SearchRequest();
//        request.indices("user");
//
//        SearchSourceBuilder builder = new SearchSourceBuilder();
//        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//
//        //boolQueryBuilder.must(QueryBuilders.matchQuery("age", 30));
//        //boolQueryBuilder.must(QueryBuilders.matchQuery("sex", "男"));
//        //boolQueryBuilder.mustNot(QueryBuilders.matchQuery("sex", "男"));
//        boolQueryBuilder.should(QueryBuilders.matchQuery("age", 30));
//        boolQueryBuilder.should(QueryBuilders.matchQuery("age", 40));
//
//        builder.query(boolQueryBuilder);
//
//        request.source(builder);
//        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
//
//        SearchHits hits = response.getHits();
//
//        System.out.println(hits.getTotalHits());
//        System.out.println(response.getTook());
//
//        for ( SearchHit hit : hits ) {
//            System.out.println(hit.getSourceAsString());
//        }

//        // 7. 范围查询
//        SearchRequest request = new SearchRequest();
//        request.indices("user");
//
//        SearchSourceBuilder builder = new SearchSourceBuilder();
//        RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age");
//
//        rangeQuery.gte(30);
//        rangeQuery.lt(50);
//
//        builder.query(rangeQuery);
//
//        request.source(builder);
//        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
//
//        SearchHits hits = response.getHits();
//
//        System.out.println(hits.getTotalHits());
//        System.out.println(response.getTook());
//
//        for ( SearchHit hit : hits ) {
//            System.out.println(hit.getSourceAsString());
//        }

        // 8. 模糊查询
//        SearchRequest request = new SearchRequest();
//        request.indices("user");
//
//        SearchSourceBuilder builder = new SearchSourceBuilder();
//        builder.query(QueryBuilders.fuzzyQuery("name", "wangwu").fuzziness(Fuzziness.TWO));
//
//        request.source(builder);
//        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
//
//        SearchHits hits = response.getHits();
//
//        System.out.println(hits.getTotalHits());
//        System.out.println(response.getTook());
//
//        for ( SearchHit hit : hits ) {
//            System.out.println(hit.getSourceAsString());
//        }

//        // 9. 高亮查询
//        SearchRequest request = new SearchRequest();
//        request.indices("user");
//
//        SearchSourceBuilder builder = new SearchSourceBuilder();
//        TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("name", "zhangsan");
//
//        HighlightBuilder highlightBuilder = new HighlightBuilder();
//        highlightBuilder.preTags("<font color='red'>");
//        highlightBuilder.postTags("</font>");
//        highlightBuilder.field("name");
//
//        builder.highlighter(highlightBuilder);
//        builder.query(termsQueryBuilder);
//
//        request.source(builder);
//        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
//
//        SearchHits hits = response.getHits();
//
//        System.out.println(hits.getTotalHits());
//        System.out.println(response.getTook());
//
//        for ( SearchHit hit : hits ) {
//            System.out.println(hit.getSourceAsString());
//        }

//        // 10. 聚合查询
//        SearchRequest request = new SearchRequest();
//        request.indices("user");
//
//        SearchSourceBuilder builder = new SearchSourceBuilder();
//
//        AggregationBuilder aggregationBuilder = AggregationBuilders.max("maxAge").field("age");
//        builder.aggregation(aggregationBuilder);
//
//        request.source(builder);
//        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
//
//        SearchHits hits = response.getHits();
//
//        System.out.println(hits.getTotalHits());
//        System.out.println(response.getTook());
//
//        for ( SearchHit hit : hits ) {
//            System.out.println(hit.getSourceAsString());
//        }

        // 11. 分组查询
        SearchRequest request = new SearchRequest();
        request.indices("user");

        SearchSourceBuilder builder = new SearchSourceBuilder();

        AggregationBuilder aggregationBuilder = AggregationBuilders.terms("ageGroup").field("age");
        builder.aggregation(aggregationBuilder);

        request.source(builder);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);

        SearchHits hits = response.getHits();

        System.out.println(hits.getTotalHits());
        System.out.println(response.getTook());

        for ( SearchHit hit : hits ) {
            System.out.println(hit.getSourceAsString());
        }



        esClient.close();
    }

posted on 2021-06-25 19:37  坏先生  阅读(129)  评论(0)    收藏  举报