ElasticSearch基础操作
1. 安装postman
略
2. HTTP操作
2.1 文档操作
2.1.1 创建文档(post)
{
"_index": "shopping", # 索引名字
"_type": "_doc", # 类型:文档
"_id": "LK6O_J4BxidwAQ78tNpn", # 唯一标识,类似mysql主键id,这里是随机生成。
"_version": 1,
"result": "created", # 创建成功
"_shards": { # 分片信息
"total": 2, # 分片数量
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
{ "_index": "shopping", # 索引名字 "_type": "_doc", # 类型:文档 "_id": "LK6O_J4BxidwAQ78tNpn", # 唯一标识,类似mysql主键id,这里是随机生成。 "_version": 1, "result": "created", # 创建成功 "_shards": { # 分片信息 "total": 2, # 分片数量 "successful": 1, "failed": 0 }, "_seq_no": 0, "_primary_term": 1 }如果要自己指定id,而不是让es随机生成,可以在URL中指定
http://hadoop101:9200/shopping/_doc/1
2.1.2 查看文档(get)
错误:http://hadoop101:9200/shopping/_doc/
正确:http://hadoop101:9200/shopping/_doc/1(要带上主键)
2.1.3 修改文档(post)
覆盖模式
http://hadoop101:9200/shopping/_doc/1
更新模式(修改单个字段)
http://hadoop101:9200/shopping/_update/1
覆盖会以当前的字段名、数量,覆盖。
更新则会更新当前字段的内容,如果这个字段以前不存在,则会新增。
2.1.4 删除文档(delete、post)
根据主键删除(delete)
http://hadoop101:9200/shopping/_doc/1
根据条件删除(post)
http://hadoop101:9200/shopping/_delete_by_query
正则匹配
{ "query" : { "regexp" : { "title": "_doc_.*" } } }完全匹配
{ "query" : { "match" : { "title": "_doc_" } } }
2.2 高级查询
2.2.1 查询所有文档(get)
http://hadoop101:9200/shopping/_search
{ "query" : { "match_all" : {} } }"took": 5, # 查询耗时:ms
2.2.2 匹配查询
http://hadoop101:9200/shopping/_search
{ "query" : { "match" : { "title" : "手机名字" } } }查看要查找的内容,会怎样进行切分。
post(http://hadoop101:9200/shopping/_analyze) { "text" : "手机1", "field" : "name" }2.2.3 字段匹配查询(get)
http://hadoop101:9200/shopping/_search { "query" : { "multi_match" : { "query" : "手", "fields" : ["name", "title"] } } }2.2.4 关键字精确查询
{ "query" : { "term" : { "title.keyword" : "手机1" } } } --------------------------- # title是text类型,在es中,会对这个字段进行分词,也就是底层存储的是[手,机,1] { "query" : { "term" : { "title" : { "value" : "手机1" } } } }
2.2.5 多关键字精确查询
{ "query" : { "terms" : { "title.keyword" : ["手机2", "手机1"] } } }
2.2.6 指定展示查询的字段
{ "_source" : ["name", "title"], "query" : { "terms" : { "title.keyword" : ["手机2", "手机1"] } } }
2.2.7 过滤字段
includes,展示的字段
excludes,不展示的字段。
同时存在的字段,则不会展示
{ "_source" : { "includes" : ["price"], "excludes" : ["price"] }, "query" : { "terms" : { "title.keyword" : ["手机2", "手机1"] } } }
2.2.8 组合查询
{ "query" : { "bool" : { "must" : [{"term":{"name.keyword":"手"}}] , "must_not" : [{"term" : {"title.keyword":"手机2"}}] } } }
2.2.9 范围查询
{ "query" : { "range" : { "price" : { "gte" : 10, "lte" : 10000 } } } }
2.2.10 模糊查询
{ "query" : { "fuzzy" : { "name" : { "value" : "Samsung" } } } }
2.2.11 多字段排序
"_score"不是一个实际字段,而是es查询时,计算出来的匹配度。比如在淘宝搜索"运动鞋",按价格排序。如果价格相同,则根据匹配度来排序。这个字段,暂时还不知道用处。
{"query": { "match_all" : {} } , "sort" : [ {"price": { "order": "desc" }}, { "_score" : { "order" : "desc" } } ] }
2.2.12 聚合查询
size=0,则只返回聚合结果
size=3,则返回3条查询结果,并返回聚合结果(聚合的还是所有price的累加)。
{"aggs":{ "max_age" : { "sum" : {"field":"price"} } } ,"size" : 0 }
2.2.13 桶聚合查询
意思是可以对多个字段进行聚合,类似group by A, B
{ "aggs":{ "max_age" : { "terms" : {"field":"name.keyword"}, "aggs": { "sum-price": { "sum" : {"field" : "price"} } } } } ,"size" : 0 }2.3 映射操作
索引库 = database,索引 = 表,文档 = 一行数据
# 查询有多少个索引(表) [get] >> http://hadoop101:9200/_cat/indices # 查看索引(建表语句) [get] >> http://hadoop101:9200/shopping/_mappingtype类型:
string
text:可分词
keyword:不可分词
numerical
long,integer,short,byte,double,float,half_float
scaled_float:浮点、高精度
date:日期
array:数组
Object:对象index
True:字段会被索引(默认)
false:不会被索引,不能用来搜索store:数据将独立存储,默认false
2.3.1 创建索引
[put] >> http://hadoop101:9200/test02/
在URL中写_mapping,是索引已经存在的前提下。如果没有存在,则用下面的方式
{ "mappings":{ "properties":{ "name":{ "type":"text", "index":true }, "sex":{ "type":"text", "index":false }, "age":{ "type":"long", "index":false } } } }使用下面这种写法,要注意。如果这里定义的index和以前的不一样,会报错。
{ "properties":{ "name":{ "type":"text", "index":true }, "price":{ "type":"long", "index":true } } }2.3.2 查看索引
【GET】 >>> http://hadoop101:9200/test03/_mapping
2.4 索引操作(了解)
【GET】 >>> http://hadoop101:9200/_cat/indices?v 查看所有索引
【GET】 >>> http://hadoop101:9200/test03 查看单个索引
【DELETE】 >>> http://hadoop101:9200/test03 删除索引
3. Java API操作
3.1 创建Maven
<dependencies> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.8.0</version> </dependency> <!-- elasticsearch 的客户端 --> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.8.0</version> </dependency> <!-- elasticsearch 依赖 2.x 的 log4j --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.9</version> </dependency> <!-- junit 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>3.2 索引操作
3.2.1)创建索引
RestHighLevelClient esClient = new RestHighLevelClient( RestClient.builder(new HttpHost("hadoop101", 9200, "http")) ); // 创建索引 - 请求对象 CreateIndexRequest request = new CreateIndexRequest("users"); // 发送请求,获取响应 CreateIndexResponse response = esClient.indices().create( request, RequestOptions.DEFAULT ); boolean acknowledged = response.isAcknowledged(); // 响应状态 System.out.println("操作状态 = " + acknowledged); esClient.close();3.2.2)查看索引
// 查询索引 GetIndexRequest request = new GetIndexRequest("test"); // 发送请求,获取响应 GetIndexResponse response = client.indices().get( request, RequestOptions.DEFAULT ); System.out.println("表(索引)别称:" + response.getAliases()); System.out.println("映射mappings:" + response.getMappings()); System.out.println("设置settings:" + response.getSettings());3.2.3)删除索引
// 删除索引 DeleteIndexRequest request = new DeleteIndexRequest("test"); // 发送请求,获取响应 AcknowledgedResponse response = client.indices().delete( request, RequestOptions.DEFAULT ); // 操作结果 System.out.println("操作结果:" + response.isAcknowledged());3.3 文档操作
3.3.1)新增文档
// 新增文档 IndexRequest request = new IndexRequest(); // 设置索引及唯一性标识 request.index("user").id("1001"); // 创建数据 User user = new User(); user.setName("zhangsan"); user.setAge(18); user.setSex("man...."); ObjectMapper objectMapper = new ObjectMapper(); String productionJson = objectMapper.writeValueAsString(user); // 添加文档数据,数据格式为Json格式 request.source(productionJson, XContentType.JSON); // 客户端发送请求,获取响应对象 IndexResponse response = client.index(request, RequestOptions.DEFAULT);3.3.2)修改文档
要修改多个字段,则如下语法
// 修改文档 - 请求对象 UpdateRequest request = new UpdateRequest(); // 配置修改参数 request.index("user").id("1001"); // 修改数据 request.doc(XContentType.JSON, "name", "张三", "sex", "nv"); // 客户端发送 UpdateResponse response = client.update(request, RequestOptions.DEFAULT);3.3.3)查询文档
3.3.4)删除文档
3.3.5)批量操作
3.4 高级查询
3.4.1)请求体查询
3.4.2)高亮查询
3.4.3)聚合查询
