一、介绍
非关系型数据库 + 搜索分析
分布式(在ES里面默认有一个配置,clustername 默认值就是ElasticSearch,如果这个值是一样的就属于同一个集群,不一样的值就是不一样的集群。)
primary shard:能正常提供查询和插入的分片
replica shard:备份的分片
倒排索引
1.1名词
index索引(索引库,相当于database)
type类型(相当于table,最新版elasticsearch已删除)
document文档(一条数据)
field字段(相当于列)
1.2数据类型
数据类型,参照JSON。
Keyword 类型是不会分词的,直接根据字符串内容建立反向索引。
Text 类型在存入 Elasticsearch 的时候,会先分词,然后根据分词后的内容建立反向索引。
二、kibana操作
2.1总体
GET _cat/health 查看集群的健康状况
green:每个索引的primary shard和replica shard 都处于active的状态。
yellow:每个索引的primary shard是active的状态,但是部分replica shard不是active的状态,处于不可用的状态。
red:不是所有的primary shard 都是active的状态,这时候是危险的,至少我们不能保证写数据是安全的。
GET _cat/indices 命令查询ES中所有的index GET _cat/indices?v
但是可能查询的不全,我们使用下面的命令
GET _all
PUT 类似于SQL中的增
DELETE 类似于SQL中的删
POST 类似于SQL中的改(elasticsearch 8.12.0版本中 POST功能和PUT相同)
GET 类似于SQL中的查
2.2 index操作
PUT aura_index 增加一个aura_index的index库
GET _cat/indices 命令查询ES中所有的index索引库
DELETE aura_index 删除一个aura_index的index库
2.3 document操作
PUT 索引/_doc/{id} 增加id为{id}的数据(必须要有_doc)
{……}
GET 索引/_doc/{id} 查询id为{id}的数据
GET 索引/_search 查询索引内所有数据
GET 索引/_search { "query":{ "match": { "name": "chen" } }, "sort": [ { "ind": { "order": "desc" //按ind降序排列 } }, {……} ], "from":0, //从第几个开始 "size":2 //每页的数据 "_source": ["name"] // 返回指定字段的数据内容 }
如果需要多个查询条件拼接在一起就需要使用bool
bool 过滤可以用来合并多个过滤条件查询结果的布尔逻辑,它包含以下操作符:
must :: 多个查询条件的完全匹配,相当于 and。
must_not :: 多个查询条件的相反匹配,相当于 not。
should :: 至少有一个查询条件匹配, 相当于 or。
这些参数可以分别继承一个过滤条件或者一个过滤条件的数组
查询条件也会进行分词
高光
GET index3/_search { "query": { //要有query "match": { "name": "1" } }, "highlight": { "fields": { "name":{} } } }
GET index3/_search { "query": { "match_all": { } }, "aggs": { "group_by_ind": { //long类型可以不进行上面的设置 "terms": { "field": "ind" } } } }
POST index3/_mapping { "properties": { "name": { "type": "text", "fielddata": true } } } GET index3/_search { "query": { "match_all": { } }, "aggs": { "group_by_name": { "terms": { "field": "name" } } } }
案例:查询出producer里面包含producer的数据,按照指定的价格区间进行分组,在每个组内再按tag进行分组,分完组以后再求每个组的平均价格,并且按照降序进行排序
POST 索引/_doc/{id} 修改id为{id}的数据,PUT也有修改作用
{……}
三、restful api 操作
大体上上kibana相同,
eg. GET http://localhost:9200/index3/_doc/3
如果有参数,连带{}一起放入请求体中
四、在java中使用elasticsearch
4.1配置
在pom.xml的<dependencies>中添加下面的依赖
<dependency> <groupId>co.elastic.clients</groupId> <artifactId>elasticsearch-java</artifactId> <version>8.12.0</version> </dependency>
4.2 创建客户端
private static ElasticsearchClient getElasticsearchClient() { // 创建低级客户端 restClient = RestClient.builder( new HttpHost("localhost", 9200)).build(); // 使用Jackson映射器创建传输层 transport = new RestClientTransport( restClient, new JacksonJsonpMapper()); // 创建API客户端 return new ElasticsearchClient(transport); // System.out.println(client); }
4.3关闭客户端
private static void closeElasticsearchClient() throws IOException{ restClient.close(); transport.close(); }
4.4索引相关
private static boolean createIndex(String index) throws IOException{ // 创建索引 CreateIndexResponse createIndexResponse = client.indices().create(c -> c.index(index)); // 打印结果 return createIndexResponse.acknowledged(); } private static String getIndex(String index) throws IOException{ GetIndexResponse getIndexResponse = client.indices().get(e->e.index(index)); System.out.println(getIndexResponse); return String.join(",", getIndexResponse.result().keySet()); } private static boolean deleteIndex(String index) throws IOException{ DeleteIndexResponse deleteIndexResponse = client.indices().delete(e->e.index(index)); return deleteIndexResponse.acknowledged(); }
4.4 Doc相关
private static Result createDoc(String index, user user1, String id)throws IOException{ // 构建一个创建Doc的请求 CreateResponse createResponse = client.create(e->e.index(index).id(id).document(user1)); // 打印请求结果 return createResponse.result(); } private static Result updateDoc() throws IOException{ // test // 构建需要修改的内容,这里使用了Map Map<String, Object> map = new HashMap<>(); map.put("ind", 35); // 构建修改文档的请求 UpdateResponse<user> response = client.update(e -> e.index("index3").id("4").doc(map), user.class); // 打印请求结果 System.out.println(response.result()); return response.result(); }
查找索引,感觉由于参数多,会有很多种语句的写法,这里只写出一种
SearchRequest searchRequest = SearchRequest.of(s -> s .index("index3") .query(q -> q .bool(b -> b .must(m -> m.term(t -> t.field("name").value(FieldValue.of("1")))) ) )); SearchResponse<user> search = client.search(searchRequest, user.class); // System.out.println(search.hits().hits().stream().map(Hit::source).toList()); List<user> list = search.hits().hits().stream().map(Hit::source).toList(); System.out.println(list.get(0).getName());
其中“index3”是索引名,“name”是要找匹配的内容,“1”是要找的值
文章有参考