ElasticSearch[02]ElasticSearchJavaAPI

参考视频

【狂神说Java】ElasticSearch7.6.x最新完整教程通俗易懂 P13.

【狂神说Java】ElasticSearch7.6.x最新完整教程通俗易懂 P14.

环境准备

软件版本
ElasticSearch7.8.1
IDEA2021.2
ElasticSearch Head0.1.5

创建普通maven项目

pom.xml

添加依赖

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
            <scope>compile</scope>
        </dependency>
        <!--同安装版本的elasticsearch-rest-high-level-client-->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.8.1</version>
        </dependency>
        <!--log4j-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.13.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.13.3</version>
        </dependency>
    </dependencies>

log4j2.xml

resources配置log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%-5p] %d %c - %m%n" />
        </Console>
    </Appenders>

    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

ElasticSearchClientConfig.java

编写ElasticSearchClient配置类

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

public class ElasticSearchClientConfig {
    public static RestHighLevelClient getRestHighLevelClient(){
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("127.0.0.1", 9200, "http"))
        );
        return client;
    }
}

user.java

编写pojo实体类

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String name;
    private int age;
}

APITest.java

创建测试类编写测试方法

import com.alibaba.fastjson.JSON;
import com.elasticsearch.api.config.ElasticSearchClientConfig;
import com.elasticsearch.api.pojo.User;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;
import java.util.concurrent.TimeUnit;

public class APITest {
    RestHighLevelClient client;
    
    @Before
    public void before() {
        client=ElasticSearchClientConfig.getRestHighLevelClient();
    }
}

ElasticSearch Java API测试

创建索引

    //创建索引
    @Test
    public void testCreateIndex() throws IOException {
        //创建索引请求
        CreateIndexRequest request = new CreateIndexRequest("user_index");
        //执行创建请求
        CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
        //打印运行结果
        System.out.println(createIndexResponse.isAcknowledged());
    }
true

获取索引

    //获取索引
    @Test
    public void testExistIndex() throws IOException {
        GetIndexRequest request = new GetIndexRequest("user_index");
        boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
        System.out.println(exists);
    }
true

删除索引

    //删除索引
    @Test
    public void testDeleteIndex() throws IOException {
        DeleteIndexRequest request = new DeleteIndexRequest("user_index");
        AcknowledgedResponse delete = client.indices().delete(request, RequestOptions.DEFAULT);
        System.out.println(delete.isAcknowledged());
    }
true

添加数据到测试文档

    //添加数据到测试文档
    @Test
    public void testAddDocument() throws IOException {
        //创建对象
        User user = new User("aa", 12);

        //创建请求
        IndexRequest request = new IndexRequest("user_index");

        //规则 put /user_index/_doc/1
        request.id("1");//若不设置id则生成随机id
        //响应时间
        //request.timeout(TimeValue.timeValueSeconds(1));
        request.timeout("1s");

        //将数据放入请求
        request.source(JSON.toJSONString(user), XContentType.JSON);

        //客户端发送请求,获取响应结果
        IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);

        System.out.println(indexResponse.toString());
        System.out.println(indexResponse.status());//对应命令返回状态
    }
IndexResponse[index=user_index,type=_doc,id=1,version=1,result=created,seqNo=0,primaryTerm=1,shards={"total":2,"successful":1,"failed":0}]
CREATED

文档主键查询

    //文档主键查询
    //获取测试文档,判断是否存在 get /index/doc/1
    @Test
    public void testExists() throws Exception {
        GetRequest user_index = new GetRequest("user_index", "1");
        //不获取返回的_source 的上下文
        user_index.fetchSourceContext(new FetchSourceContext(false));
        user_index.storedFields("_none_");

        boolean exists = client.exists(user_index, RequestOptions.DEFAULT);
        System.out.println(exists);
    }
true

获得文档信息

    //获得文档信息
    @Test
    public void testGetDocuments() throws Exception {
        GetRequest user_index = new GetRequest("user_index", "1");
        GetResponse getResponse = client.get(user_index, RequestOptions.DEFAULT);
        System.out.println(getResponse.getSourceAsString());//打印文档的内容
        System.out.println(getResponse);
    }
{"age":12,"name":"aa"}
{"_index":"user_index","_type":"_doc","_id":"1","_version":1,"_seq_no":0,"_primary_term":1,"found":true,"_source":{"age":12,"name":"aa"}}

更新文档信息

    //更新文档信息
    @Test
    public void testUpdateDocuments() throws Exception {
        UpdateRequest updateRequest = new UpdateRequest("user_index", "1");
        updateRequest.timeout("1s");

        User bb = new User("bb", 18);
        updateRequest.doc(JSON.toJSONString(bb), XContentType.JSON);

        UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
        System.out.println(updateResponse);
        System.out.println(updateResponse.status());
    }
UpdateResponse[index=user_index,type=_doc,id=1,version=2,seqNo=1,primaryTerm=1,result=updated,shards=ShardInfo{total=2, successful=1, failures=[]}]
OK

删除文档记录

    //删除文档记录
    @Test
    public void testDeleteDocuments() throws Exception {
        DeleteRequest deleteRequest = new DeleteRequest("user_index", "1");
        deleteRequest.timeout("1s");

        DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
        System.out.println(deleteResponse);
        System.out.println(deleteResponse.status());
    }
DeleteResponse[index=user_index,type=_doc,id=1,version=3,result=deleted,shards=ShardInfo{total=2, successful=1, failures=[]}]
OK

批量添加数据到测试文档

    //批量添加数据到测试文档
    @Test
    public void testBulkRequest() throws Exception {
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.timeout("1s");

        ArrayList<User> userList = new ArrayList<>();
        userList.add(new User("aa", 11));
        userList.add(new User("bb", 12));
        userList.add(new User("cc", 13));
        userList.add(new User("dd", 14));
        userList.add(new User("ee", 15));

        int i = 1;
        for (User user : userList) {
            //批量更新和批量删除 处理请求
            bulkRequest.add(
                    new IndexRequest("user_index")
                            .id(i + "")
                            .source(JSON.toJSONString(user), XContentType.JSON)
            );
            i++;
        }

        BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println(bulkResponse.hasFailures());//是否失败 false代表成功
    }
false

文档条件查询(高亮、分页)

多添加几条name=aa的数据用于测试
[图片]

    //文档条件查询
    @Test
    public void testSearch() throws Exception {
        SearchRequest searchRequest = new SearchRequest("user_index");
        //构建搜索条件
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        
//        MatchAllQueryBuilder termQueryBuilder = QueryBuilders.matchAllQuery();//matchAll匹配所有
        //查询条件可以使用QueryBuilders工具类实现
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "aa");//term精确匹配
        sourceBuilder.query(termQueryBuilder);
        
        //设置高亮
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder
                .field("name")//高亮字段
                .requireFieldMatch(false)//是否每个字都高亮
                .preTags("<span style='color:red'>")//高亮前缀
                .postTags("</span>");//高亮后缀
        sourceBuilder.highlighter(highlightBuilder);
        
        sourceBuilder.from();//页码
        sourceBuilder.size();//每页条数
        sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));

        searchRequest.source(sourceBuilder);
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        System.out.println(JSON.toJSONString(searchResponse.getHits()));
        
        System.out.println("*******打印文档内容*********");
        for (SearchHit documentFields : searchResponse.getHits().getHits()) {
            System.out.println(documentFields.getSourceAsMap());
        }

        System.out.println("********内容高亮显示********");
        for (SearchHit documentFields : searchResponse.getHits().getHits()) {
            Map<String, HighlightField> highlightFields = documentFields.getHighlightFields();
            HighlightField name = highlightFields.get("name");
            Map<String, Object> sourceAsMap = documentFields.getSourceAsMap();
            if (name != null) {
                Text[] fragments = name.fragments();
                String newTitle = "";
                for (Text text : fragments) {
                    newTitle += text;
                }
                sourceAsMap.put("name", newTitle);
            }
            System.out.println(sourceAsMap);
        }
    }
{"fragment":true,"hits":[{"fields":{},"fragment":false,"highlightFields":{"name":{"fragment":true,"fragments":[{"fragment":true}],"name":"name"}},"id":"1","matchedQueries":[],"primaryTerm":0,"rawSortValues":[],"score":0.7985077,"seqNo":-2,"sortValues":[],"sourceAsMap":{"name":"aa","age":11},"sourceAsString":"{\"age\":11,\"name\":\"aa\"}","sourceRef":{"fragment":true},"type":"_doc","version":-1},{"fields":{},"fragment":false,"highlightFields":{"name":{"fragment":true,"fragments":[{"fragment":true}],"name":"name"}},"id":"GI1_mH0BKTXNK4J9Fszy","matchedQueries":[],"primaryTerm":0,"rawSortValues":[],"score":0.7985077,"seqNo":-2,"sortValues":[],"sourceAsMap":{"name":"aa","age":13},"sourceAsString":"{\"age\":13,\"name\":\"aa\"}","sourceRef":{"fragment":true},"type":"_doc","version":-1},{"fields":{},"fragment":false,"highlightFields":{"name":{"fragment":true,"fragments":[{"fragment":true}],"name":"name"}},"id":"GY1_mH0BKTXNK4J9Qsxb","matchedQueries":[],"primaryTerm":0,"rawSortValues":[],"score":0.7985077,"seqNo":-2,"sortValues":[],"sourceAsMap":{"name":"aa","age":15},"sourceAsString":"{\"age\":15,\"name\":\"aa\"}","sourceRef":{"fragment":true},"type":"_doc","version":-1}],"maxScore":0.7985077,"totalHits":{"relation":"EQUAL_TO","value":3}}
*******打印文档内容*********
{name=aa, age=11}
{name=aa, age=13}
{name=aa, age=15}
********内容高亮显示********
{name=<span style='color:red'>aa</span>, age=11}
{name=<span style='color:red'>aa</span>, age=13}
{name=<span style='color:red'>aa</span>, age=15}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值