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 匹配查询
- 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();
}
浙公网安备 33010602011771号