当前位置: 首页 > article >正文

ES的java操作

ES的java操作

一、添加依赖

在pom文件中添加依赖包

    <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.11.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.11.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.9</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

二、基本框架

package com.wbb.es;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;


public class Elasticsearch_Client {
    public static void main(String[] args) throws Exception {
        // 创建ES客户端
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        /*
         中间要做的事儿
        */


        // 关闭ES客户端
        client.close();
    }
}

三、索引操作

3.1 创建

创建索引 test_java

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

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

3.2 查看

// 查询索引
GetIndexRequest request = new GetIndexRequest("test_java");
// 发送请求
GetIndexResponse response = client.indices().get(request,
        RequestOptions.DEFAULT);
System.out.println("aliases:"+response.getAliases());
System.out.println("mappings:"+response.getMappings());
System.out.println("settings:"+response.getSettings());

输出内容

aliases:{test_java=[]}
mappings:{test_java=org.elasticsearch.cluster.metadata.MappingMetadata@e2fe038d}
settings:{test_java={"index.creation_date":"1739345734421","index.number_of_replicas":"1","index.number_of_shards":"1","index.provided_name":"test_java","index.uuid":"R-2HSigUTCSH1mG9kiowrg","index.version.created":"7080099"}}

3.2 删除索引

// 删除索引 - 请求对象
DeleteIndexRequest request = new DeleteIndexRequest("test_java");
// 发送请求,获取响应
AcknowledgedResponse response = client.indices().delete(request,
        RequestOptions.DEFAULT);
// 操作结果
System.out.println("操作结果 : " + response.isAcknowledged());

四、文档操作

创建javabean

快捷键:定义属性后 ctrl + shift + a,选择 Generate …alt + insert,选择对应的getter和setter

package com.wbb.es;

public class test_es {
    private String name;
    private Integer age;
    private String sex;
    public void setName(String name) {
        this.name = name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }

    public String getSex() {
        return sex;
    }

}

4.1创建

4.1.1 添加单个文档

在索引 test_java下添加文档编号为001的文档

// 1、新增文档 - 请求对象
IndexRequest request = new IndexRequest();
// 2、设置索引及唯一性标识
request.index("test_java").id("001");
// 3、创建数据对象
Test_es test_es = new Test_es();
test_es.setName("tianxuanzhizi");
test_es.setAge(30);
test_es.setSex("男");
ObjectMapper objectMapper = new ObjectMapper();
String productJson = objectMapper.writeValueAsString(test_es);
// 4、添加文档数据,数据格式为 JSON 格式
request.source(productJson, XContentType.JSON);
// 5、客户端发送请求,获取响应对象
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
// 打印结果信息
System.out.println("_index:" + response.getIndex());
System.out.println("_id:" + response.getId());
System.out.println("_result:" + response.getResult());

输出信息

_index:test_java
_id:001
_result:CREATED
4.1.2 添加多个文档
//创建批量新增请求对象
BulkRequest request = new BulkRequest();
request.add(new IndexRequest().index("test_java").id("001").source(XContentType.JSON, "name",
        "tianxuanzhizi001", "age", 30, "sex", "男"));
request.add(new IndexRequest().index("test_java").id("002").source(XContentType.JSON, "name",
        "tianxuanzhizi002", "age", 31, "sex", "女"));
//客户端发送请求,获取响应对象
BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT);
//打印结果信息
System.out.println("took:" + responses.getTook());
System.out.println("items:" + responses.getItems());

输出结果

took:198ms
items:[Lorg.elasticsearch.action.bulk.BulkItemResponse;@5609159b

4.2 修改

修改 test_java索引下,id为 001 的文档,sex为”未知“

// 1、修改文档 - 请求对象
UpdateRequest request = new UpdateRequest();
// 2、配置修改参数
request.index("test_java").id("001");
// 3、设置请求体,对数据进行修改
request.doc(XContentType.JSON, "sex", "未知");
// 客户端发送请求,获取响应对象
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
System.out.println("_index:" + response.getIndex());
System.out.println("_id:" + response.getId());
System.out.println("_result:" + response.getResult());

输出信息

_index:test_java
_id:001
_result:UPDATED

4.3 查看

//1.创建请求对象
GetRequest request = new GetRequest().index("test_java").id("001");
//2.客户端发送请求,获取响应对象
GetResponse response = client.get(request, RequestOptions.DEFAULT);
//3.打印结果信息
System.out.println("_index:" + response.getIndex());
System.out.println("_type:" + response.getType());
System.out.println("_id:" + response.getId());
System.out.println("source:" + response.getSourceAsString());

输出结果

_index:test_java
_type:_doc
_id:001
source:{"name":"tianxuanzhizi","age":30,"sex":"未知"}

4.4 删除

4.4.1 删除单个文档
//1、创建请求对象
DeleteRequest request = new DeleteRequest().index("test_java").id("001");
//2、客户端发送请求,获取响应对象
DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
//打印信息
System.out.println(response.toString());

输出信息

DeleteResponse[index=test_java,type=_doc,id=001,version=3,result=deleted,shards=ShardInfo{total=2, successful=1, failures=[]}]
4.4.2 删除多个文档
//创建批量删除请求对象
BulkRequest request = new BulkRequest();
request.add(new DeleteRequest().index("test_java").id("001"));
request.add(new DeleteRequest().index("test_java").id("002"));
//客户端发送请求,获取响应对象
BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT);
//打印结果信息
System.out.println("took:" + responses.getTook());
System.out.println("items:" + responses.getItems());
System.out.println("items:" + responses.getItems());

输出信息

took:201ms
items:[Lorg.elasticsearch.action.bulk.BulkItemResponse;@7c9d8e2
items:[Lorg.elasticsearch.action.bulk.BulkItemResponse;@7c9d8e2

4.5 查询

4.5.1 查询的基本框架
package com.wbb.es;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;


public class Elasticsearch_Client {
    public static void main(String[] args) throws Exception {
        // 创建ES客户端
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 创建搜索请求对象
        SearchRequest request = new SearchRequest();
        request.indices("test_java");

        // 构建查询的请求体
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        /*
        查询设置
        */

        request.source(sourceBuilder); 
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        // 查询匹配
        SearchHits hits = response.getHits();
        System.out.println("took:" + response.getTook());
        System.out.println("timeout:" + response.isTimedOut());
        System.out.println("total:" + hits.getTotalHits());
        System.out.println("MaxScore:" + hits.getMaxScore());
        System.out.println("========doc=========");
        for (SearchHit hit : hits) {
            //输出每条查询的结果信息
            System.out.println(hit.getSourceAsString());
        }


        // 关闭ES客户端
        client.close();
    }
}
4.5.1 查询所有文档
sourceBuilder.query(QueryBuilders.matchAllQuery());

输出信息

took:2ms
timeout:false
total:2 hits
MaxScore:1.0
========doc=========
{"name":"tianxuanzhizi001","age":30,"sex":"男"}
{"name":"tianxuanzhizi002","age":31,"sex":"女"}
4.5.2 按照字段名进行查询
sourceBuilder.query(QueryBuilders.termQuery("age", "30"));

输出

took:3ms
timeout:false
total:1 hits
MaxScore:1.0
========doc=========
{"name":"tianxuanzhizi001","age":30,"sex":"男"}
4.5.3 分页查询
sourceBuilder.query(QueryBuilders.matchAllQuery());
// 分页查询
// 分页起始位置(第一条数据的顺序号)
sourceBuilder.from(0);
// 每页显示多少条
sourceBuilder.size(2);

输出

took:2ms
timeout:false
total:2 hits
MaxScore:1.0
========doc=========
{"name":"tianxuanzhizi001","age":30,"sex":"男"}
{"name":"tianxuanzhizi002","age":31,"sex":"女"}
4.5.4 排序查询

按照年龄排序

sourceBuilder.query(QueryBuilders.matchAllQuery());
sourceBuilder.sort("age", SortOrder.ASC);
4.5.5 过滤字段
sourceBuilder.query(QueryBuilders.matchAllQuery());
// 只查看 name 和 age
String[] excludes = {}; 
String[] includes = {"name", "age"}; 
sourceBuilder.fetchSource(includes, excludes); 
4.5.6 组合查询
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 必须包含
boolQueryBuilder.must(QueryBuilders.matchQuery("age", "30"));
// 一定不含
boolQueryBuilder.mustNot(QueryBuilders.matchQuery("name", "bug"));
// 可能包含
boolQueryBuilder.should(QueryBuilders.matchQuery("sex", "男"));

sourceBuilder.query(boolQueryBuilder);

输出结果

took:3ms
timeout:false
total:1 hits
MaxScore:1.6931472
========doc=========
{"name":"tianxuanzhizi001","age":30,"sex":"男"}
4.5.7 范围查询
RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age");
// 大于等于
rangeQuery.gte("30");
// 小于等于
rangeQuery.lte("40");
sourceBuilder.query(rangeQuery);
4.5.8 模糊查询
sourceBuilder.query(QueryBuilders.fuzzyQuery("name","tianxuanzhizi").fuzziness(Fuzziness.ONE));
4.5.9 高亮查询
//构建查询方式:高亮查询
TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("name","tianxuanzhizi001");
//设置查询方式
sourceBuilder.query(termsQueryBuilder);
//构建高亮字段
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<font color='red'>");//设置标签前缀
highlightBuilder.postTags("</font>");//设置标签后缀
highlightBuilder.field("name");//设置高亮字段
//设置高亮构建对象
sourceBuilder.highlighter(highlightBuilder);

输出前设置高亮颜色

//打印高亮结果 
 Map<String, HighlightField> highlightFields = hit.getHighlightFields()
 System.out.println(highlightFields);;

查询结果

took:171ms
timeout:false
total:1 hits
MaxScore:1.0
========doc=========
{name=[name], fragments[[<font color='red'>tianxuanzhizi001</font>]]}
4.5.9 聚合查询

查询最大年龄

sourceBuilder.aggregation(AggregationBuilders.max("maxAge").field("age"));

输出response

System.out.println(response);    

输出结果

{"took":2,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":2,"relation":"eq"},"max_score":1.0,"hits":[{"_index":"test_java","_type":"_doc","_id":"001","_score":1.0,"_source":{"name":"tianxuanzhizi001","age":30,"sex":"男"}},{"_index":"test_java","_type":"_doc","_id":"002","_score":1.0,"_source":{"name":"tianxuanzhizi002","age":31,"sex":"女"}}]},"aggregations":{"max#maxAge":{"value":31.0}}}
4.5.10 分组聚合

按性别分组

sourceBuilder.aggregation(AggregationBuilders.terms("age_groupby").field("age"));

输出response

System.out.println(response);    

输出结果

{"took":1,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":2,"relation":"eq"},"max_score":1.0,"hits":[{"_index":"test_java","_type":"_doc","_id":"001","_score":1.0,"_source":{"name":"tianxuanzhizi001","age":30,"sex":"男"}},{"_index":"test_java","_type":"_doc","_id":"002","_score":1.0,"_source":{"name":"tianxuanzhizi002","age":31,"sex":"女"}}]},"aggregations":{"lterms#age_groupby":{"doc_count_error_upper_bound":0,"sum_other_doc_count":0,"buckets":[{"key":30,"doc_count":1},{"key":31,"doc_count":1}]}}}

http://www.kler.cn/a/546033.html

相关文章:

  • 20240911 光迅科技 笔试
  • QT设备树,具有设备树过滤功能
  • MATLAB中的APPdesigner绘制多图问题解析?与逻辑值转成十进制
  • 【Map vs Set】:Java数据存储的“双子星”对决
  • foobar2000设置DSP使用教程及软件推荐
  • Vue.js 实现树形结构管理系统的前端设计与实现
  • 梨花声音研修院:回南天的生活技巧与注意事项
  • python环境中pip指令Did not provide a command报错解决方法
  • AcWing 798. 差分矩阵
  • Datawhale Ollama教程笔记3
  • Lineageos 22.1(Android 15)预制APK
  • 真店混假店,九牧卫浴何时“打假”成功?
  • Deepseek R1模型本地化部署+API接口调用详细教程:释放AI生产力
  • (Windows | Linux)ssh访问服务器报错:no matching key exchange method found
  • VRPTW 问题与新兴技术结合的创新方向及具体案例
  • wordpress部署nginx版的
  • 若依系统环境搭建记录
  • 轻量级CAD编辑器CADEditorX发布15.2新版本,新增3D模型爆炸视图新工具等
  • vue2 computed
  • 3天功能开发→3小时:通义灵码2.0+DEEPSEEK实测报告,单元测试生成准确率92%的秘密