小太阳的博客

SpringBoot2操作ES

POM依赖

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.4.0</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
    <version>7.4.0</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.4.0</version>
</dependency>

application.yml配置

elasticsearch: 
    host: 127.0.0.1
    port: 1234

Bean配置

@Configuration
@ConfigurationProperties(prefix="elasticsearch")
public class ElasticSearchConfig {

    private String host;
    private int port;

    public String getHost() {
        return host;
    }
    public void setHost(String host) {
        this.host = host;
    }
    public int getPort() {
        return port;
    }
    public void setPort(int port) {
        this.port = port;
    }

    @Bean
    public RestHighLevelClient client(){
        return new RestHighLevelClient(RestClient.builder(
                new HttpHost(host,port,"http")
        ));
    }

}

注入使用

@Autowired
RestHighLevelClient client;

操作索引

import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.IndicesClient;
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.client.indices.GetIndexResponse;
import org.elasticsearch.cluster.metadata.MappingMetaData;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Map;

@SpringBootTest
class SpringbootEsApplicationTests {

    @Autowired
    RestHighLevelClient client;

    //添加索引
    @Test
    void addIndex() throws Exception {
        //1.使用client获取操作索引的对象
        IndicesClient indicesClient = client.indices();
        //2.创建person2索引
        CreateIndexRequest createRequest = new CreateIndexRequest("person2");
        CreateIndexResponse createIndexResponse = indicesClient.create(createRequest, RequestOptions.DEFAULT);
        //3.获取创建结果 - true成功,false失败
        boolean acknowledged = createIndexResponse.isAcknowledged();
        System.out.println(acknowledged);
    }

    //添加索引并指定映射
    @Test
    void addIndexAndMapping() throws Exception {
        //1.使用client获取操作索引的对象
        IndicesClient indicesClient = client.indices();
        //2.创建person2索引
        CreateIndexRequest createRequest = new CreateIndexRequest("person3");
        //3.设置映射
        String mapping = "{\n" +
                "      \"properties\" : {\n" +
                "        \"address\" : {\n" +
                "          \"type\" : \"text\",\n" +
                "          \"analyzer\" : \"ik_max_word\"\n" +
                "        },\n" +
                "        \"age\" : {\n" +
                "          \"type\" : \"long\"\n" +
                "        },\n" +
                "        \"name\" : {\n" +
                "          \"type\" : \"keyword\"\n" +
                "        }\n" +
                "      }\n" +
                "    }";
        createRequest.mapping(mapping, XContentType.JSON);
        CreateIndexResponse createIndexResponse = indicesClient.create(createRequest, RequestOptions.DEFAULT);
        //4.获取创建结果 - true成功,false失败
        boolean acknowledged = createIndexResponse.isAcknowledged();
        System.out.println(acknowledged);
    }

    //查询索引
    @Test
    void queryIndex() throws Exception {
        IndicesClient indicesClient = client.indices();
        GetIndexRequest getRequest = new GetIndexRequest("person3");
        GetIndexResponse getIndexResponse = indicesClient.get(getRequest, RequestOptions.DEFAULT);
        Map<String, MappingMetaData> mappings = getIndexResponse.getMappings();
        for (Map.Entry<String, MappingMetaData> metaDataEntry : mappings.entrySet()) {
            System.out.println("key:" + metaDataEntry.getKey() + " -> value:" + metaDataEntry.getValue().getSourceAsMap());
        }
    }

    //删除索引
    @Test
    void deleteIndex() throws Exception {
        IndicesClient indicesClient = client.indices();
        DeleteIndexRequest deleteRequest = new DeleteIndexRequest("person2");
        AcknowledgedResponse acknowledgedResponse = indicesClient.delete(deleteRequest, RequestOptions.DEFAULT);
        System.out.println(acknowledgedResponse.isAcknowledged());
    }

    //检查索引是否存在
    @Test
    void existIndex() throws Exception {
        IndicesClient indicesClient = client.indices();
        GetIndexRequest getRequest = new GetIndexRequest("person3");
        boolean exists = indicesClient.exists(getRequest, RequestOptions.DEFAULT);
        System.out.println(exists);
    }

}

操作文档

package com.example.springboot_es;

import com.alibaba.fastjson.JSONObject;
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.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.HashMap;
import java.util.Map;

//person实体
class Person{
    private String id;
    private String name;
    private Integer age;
    private String address;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
}

@SpringBootTest
class SpringbootEsApplicationTests {

    @Autowired
    RestHighLevelClient client;

    //添加文档,Map添加
    @Test
    void addDocumentByMap() throws Exception {
        Map<String, Object> data = new HashMap<>();
        data.put("address", "北京海淀北土城");
        data.put("name", "王五");
        data.put("age", 27);
        IndexRequest indexRequest = new IndexRequest("person").id("id5").source(data);
        IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
        System.out.println(indexResponse.getId());
    }

    //添加文档,实体添加
    @Test
    void addDocumentByPO() throws Exception {
        Person person = new Person();
        person.setId("id6");
        person.setName("赵六");
        person.setAge(23);
        person.setAddress("河北石家庄火车站");
        String jsonPO = JSONObject.toJSONString(person);
        IndexRequest indexRequest = new IndexRequest("person").id(person.getId()).source(jsonPO, XContentType.JSON);
        IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
        System.out.println(indexResponse.getId());
    }

    //修改文档:添加文档时,Id存在则修改,Id不存在则添加
    @Test
    void updateDocument() throws Exception {
        Person person = new Person();
        person.setId("id6");
        person.setName("赵六");
        person.setAge(25);
        person.setAddress("河北廊坊");
        String jsonPO = JSONObject.toJSONString(person);
        IndexRequest indexRequest = new IndexRequest("person").id(person.getId()).source(jsonPO, XContentType.JSON);
        IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
        System.out.println(indexResponse.getId());
    }

    //根据ID查询文档
    @Test
    void queryDocumentById() throws Exception {
        GetRequest getRequest = new GetRequest("person", "id6");
        GetResponse documentFields = client.get(getRequest, RequestOptions.DEFAULT);
        System.out.println(documentFields.getSourceAsString());
    }

    //删除文档
    @Test
    void deleteDocumentById() throws Exception {
        DeleteRequest deleteRequest = new DeleteRequest("person", "id6");
        DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
        System.out.println(deleteResponse.getId());
        System.out.println(deleteResponse.status());
    }

}

批量操作

void addDocumentByMap() throws Exception {
    //创建BulkRequest,整合所有操作
    BulkRequest bulkRequest = new BulkRequest();
    //删除id5记录
    DeleteRequest deleteRequest = new DeleteRequest("person", "id5");
    bulkRequest.add(deleteRequest);
    //插入id8记录
    Map<String, Object> data = new HashMap<>();
    data.put("address", "北京海淀北土城");
    data.put("name", "李四测试");
    data.put("age", 27);
    IndexRequest indexRequest = new IndexRequest("person").id("id10").source(data);
    bulkRequest.add(indexRequest);
    //修改id4记录
    Map<String, Object> upMap = new HashMap<>();
    upMap.put("address", "北京海淀北土城");
    upMap.put("name", "修改测试");
    upMap.put("age", 27);
    UpdateRequest updateRequest = new UpdateRequest("person", "id4").doc(upMap);
    bulkRequest.add(updateRequest);
    //执行批量操作
    BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
    System.out.println(bulkResponse.status());
}

批量插入

void importData() throws Exception {
    List<Person> personList = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        Person person = new Person();
        person.setId("id-" + i);
        person.setName("测试名称-" + i);
        person.setAddress("测试地址-" + i);
        person.setAge(20 + i);
        personList.add(person);
    }
    //创建BulkRequest
    BulkRequest bulkRequest = new BulkRequest();
    //循环数据
    for (Person person : personList) {
        String jsonString = JSONObject.toJSONString(person);
        IndexRequest indexRequest = new IndexRequest("person").id(person.getId()).source(jsonString, XContentType.JSON);
        bulkRequest.add(indexRequest);
    }
    //执行插入数据
    BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
    System.out.println(bulkResponse.status());
}

查询所有

void matchAll() throws Exception {
    SearchRequest searchResult = new SearchRequest("person");
    //查询构建器
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    //查询条件
    QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
    searchSourceBuilder.query(queryBuilder);

    //分页 - 不加分页默认10条
    searchSourceBuilder.from(0);
    searchSourceBuilder.size(100);

    searchResult.source(searchSourceBuilder);
    SearchResponse searchResponse = client.search(searchResult, RequestOptions.DEFAULT);
    SearchHits searchHits = searchResponse.getHits();
    System.out.println("总条数:" + searchHits.getTotalHits().value);
    //获取数据
    SearchHit[] hits = searchHits.getHits();
    List<Person> personList = new ArrayList<>();
    for (SearchHit hit : hits) {
        String sourceAsString = hit.getSourceAsString();
        Person person = JSONObject.parseObject(sourceAsString, Person.class);
        personList.add(person);
    }
    System.out.println(JSONObject.toJSONString(personList));
}

词条查询

void termQuery() throws Exception {
    SearchRequest searchResult = new SearchRequest("person");
    //查询构建器
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    //查询条件
    QueryBuilder queryBuilder = QueryBuilders.termQuery("address", "北京");
    searchSourceBuilder.query(queryBuilder);

    //分页 - 不加分页默认10条
    searchSourceBuilder.from(0);
    searchSourceBuilder.size(100);

    searchResult.source(searchSourceBuilder);
    SearchResponse searchResponse = client.search(searchResult, RequestOptions.DEFAULT);
    SearchHits searchHits = searchResponse.getHits();
    System.out.println("总条数:" + searchHits.getTotalHits().value);
    //获取数据
    SearchHit[] hits = searchHits.getHits();
    List<Person> personList = new ArrayList<>();
    for (SearchHit hit : hits) {
        String sourceAsString = hit.getSourceAsString();
        Person person = JSONObject.parseObject(sourceAsString, Person.class);
        personList.add(person);
    }
    System.out.println(JSONObject.toJSONString(personList));
}

分词查询

void matchQuery() throws Exception {
    SearchRequest searchResult = new SearchRequest("person");
    //查询构建器
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    //查询条件
    QueryBuilder queryBuilder = QueryBuilders.matchQuery("address", "测试北京");
    //取交集或并集
    ((MatchQueryBuilder) queryBuilder).operator(Operator.OR);
    searchSourceBuilder.query(queryBuilder);

    //分页 - 不加分页默认10条
    searchSourceBuilder.from(0);
    searchSourceBuilder.size(100);

    searchResult.source(searchSourceBuilder);
    SearchResponse searchResponse = client.search(searchResult, RequestOptions.DEFAULT);
    SearchHits searchHits = searchResponse.getHits();
    System.out.println("总条数:" + searchHits.getTotalHits().value);
    //获取数据
    SearchHit[] hits = searchHits.getHits();
    List<Person> personList = new ArrayList<>();
    for (SearchHit hit : hits) {
        String sourceAsString = hit.getSourceAsString();
        Person person = JSONObject.parseObject(sourceAsString, Person.class);
        personList.add(person);
    }
    System.out.println(JSONObject.toJSONString(personList));
}

模糊查询

void likeQuery() throws Exception {
    SearchRequest searchResult = new SearchRequest("person");
    //查询构建器
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    //widcard查询
    QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("address", "北*");

    //正则查询
    QueryBuilder queryBuilder = QueryBuilders.regexpQuery("address", "\\w+(.)*");

    //前缀查询
    QueryBuilder queryBuilder = QueryBuilders.prefixQuery("address", "北");

    searchSourceBuilder.query(queryBuilder);
    //分页 - 不加分页默认10条
    searchSourceBuilder.from(0);
    searchSourceBuilder.size(100);

    searchResult.source(searchSourceBuilder);
    SearchResponse searchResponse = client.search(searchResult, RequestOptions.DEFAULT);
    SearchHits searchHits = searchResponse.getHits();
    System.out.println("总条数:" + searchHits.getTotalHits().value);
    //获取数据
    SearchHit[] hits = searchHits.getHits();
    List<Person> personList = new ArrayList<>();
    for (SearchHit hit : hits) {
        String sourceAsString = hit.getSourceAsString();
        Person person = JSONObject.parseObject(sourceAsString, Person.class);
        personList.add(person);
    }
    System.out.println(JSONObject.toJSONString(personList));
}

范围查询

void rangeQuery() throws Exception {
    SearchRequest searchResult = new SearchRequest("person");
    //查询构建器
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

    //范围查询 年龄25-30岁
    QueryBuilder queryBuilder = QueryBuilders.rangeQuery("age");
    ((RangeQueryBuilder) queryBuilder).gte(25);
    ((RangeQueryBuilder) queryBuilder).lte(30);

    searchSourceBuilder.query(queryBuilder);
    //分页 - 不加分页默认10条
    searchSourceBuilder.from(0);
    searchSourceBuilder.size(100);

    searchResult.source(searchSourceBuilder);
    SearchResponse searchResponse = client.search(searchResult, RequestOptions.DEFAULT);
    SearchHits searchHits = searchResponse.getHits();
    System.out.println("总条数:" + searchHits.getTotalHits().value);
    //获取数据
    SearchHit[] hits = searchHits.getHits();
    List<Person> personList = new ArrayList<>();
    for (SearchHit hit : hits) {
        String sourceAsString = hit.getSourceAsString();
        Person person = JSONObject.parseObject(sourceAsString, Person.class);
        personList.add(person);
    }
    System.out.println(JSONObject.toJSONString(personList));
}

排序

void rangeQuerySort() throws Exception {
    SearchRequest searchResult = new SearchRequest("person");
    //查询构建器
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

    //范围查询 年龄25-30岁
    QueryBuilder queryBuilder = QueryBuilders.rangeQuery("age");
    ((RangeQueryBuilder) queryBuilder).gte(25);
    ((RangeQueryBuilder) queryBuilder).lte(30);

    searchSourceBuilder.query(queryBuilder);
    //分页 - 不加分页默认10条
    searchSourceBuilder.from(0);
    searchSourceBuilder.size(100);
    //排序
    searchSourceBuilder.sort("age", SortOrder.DESC);

    searchResult.source(searchSourceBuilder);
    SearchResponse searchResponse = client.search(searchResult, RequestOptions.DEFAULT);
    SearchHits searchHits = searchResponse.getHits();
    System.out.println("总条数:" + searchHits.getTotalHits().value);
    //获取数据
    SearchHit[] hits = searchHits.getHits();
    List<Person> personList = new ArrayList<>();
    for (SearchHit hit : hits) {
        String sourceAsString = hit.getSourceAsString();
        Person person = JSONObject.parseObject(sourceAsString, Person.class);
        personList.add(person);
    }
    System.out.println(JSONObject.toJSONString(personList));
}

多字段查询

void queryString() throws Exception {
    SearchRequest searchResult = new SearchRequest("person");
    //查询构建器
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

    QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("李四测试")
            .field("address").field("name").defaultOperator(Operator.OR);
    searchSourceBuilder.query(queryBuilder);
    //分页 - 不加分页默认10条
    searchSourceBuilder.from(0);
    searchSourceBuilder.size(100);

    searchResult.source(searchSourceBuilder);
    SearchResponse searchResponse = client.search(searchResult, RequestOptions.DEFAULT);
    SearchHits searchHits = searchResponse.getHits();
    System.out.println("总条数:" + searchHits.getTotalHits().value);
    //获取数据
    SearchHit[] hits = searchHits.getHits();
    List<Person> personList = new ArrayList<>();
    for (SearchHit hit : hits) {
        String sourceAsString = hit.getSourceAsString();
        Person person = JSONObject.parseObject(sourceAsString, Person.class);
        personList.add(person);
    }
    System.out.println(JSONObject.toJSONString(personList));
}

多条件查询

void boolQuery() throws Exception {
    SearchRequest searchResult = new SearchRequest("person");
    //查询构建器
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

    //1.查询地址为北京的。2.查询名字是李四测试的。
    BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();

    MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("address", "北京");
    queryBuilder.filter(matchQuery);

    TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "李四测试");
    queryBuilder.must(termQueryBuilder);

    searchSourceBuilder.query(queryBuilder);
    //分页 - 不加分页默认10条
    searchSourceBuilder.from(0);
    searchSourceBuilder.size(100);

    searchResult.source(searchSourceBuilder);
    SearchResponse searchResponse = client.search(searchResult, RequestOptions.DEFAULT);
    SearchHits searchHits = searchResponse.getHits();
    System.out.println("总条数:" + searchHits.getTotalHits().value);
    //获取数据
    SearchHit[] hits = searchHits.getHits();
    List<Person> personList = new ArrayList<>();
    for (SearchHit hit : hits) {
        String sourceAsString = hit.getSourceAsString();
        Person person = JSONObject.parseObject(sourceAsString, Person.class);
        personList.add(person);
    }
    System.out.println(JSONObject.toJSONString(personList));
}

高亮查询

void boolQuery() throws Exception {
    SearchRequest searchResult = new SearchRequest("person");
    //查询构建器
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

    //1.查询地址为北京的。2.查询名字是李四测试的。
    BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();

    MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("address", "北京");
    queryBuilder.filter(matchQuery);

    TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "李四测试");
    queryBuilder.must(termQueryBuilder);

    searchSourceBuilder.query(queryBuilder);

    //设置高亮
    HighlightBuilder highlighter = new HighlightBuilder();
    //设置三要素
    highlighter.field("address");
    //设置前后缀标签
    highlighter.preTags("<font color='red'>");
    highlighter.postTags("</font>");

    //加载已经设置好的高亮配置
    searchSourceBuilder.highlighter(highlighter);

    //分页 - 不加分页默认10条
    searchSourceBuilder.from(0);
    searchSourceBuilder.size(100);

    searchResult.source(searchSourceBuilder);
    SearchResponse searchResponse = client.search(searchResult, RequestOptions.DEFAULT);
    SearchHits searchHits = searchResponse.getHits();
    System.out.println("总条数:" + searchHits.getTotalHits().value);
    //获取数据
    SearchHit[] hits = searchHits.getHits();
    List<Person> personList = new ArrayList<>();
    for (SearchHit hit : hits) {
        String sourceAsString = hit.getSourceAsString();
        Person person = JSONObject.parseObject(sourceAsString, Person.class);
        //获取高亮结果,替换person中的address
        Map<String, HighlightField> highlightFields = hit.getHighlightFields();
        HighlightField HighlightField = highlightFields.get("address");
        Text[] fragments = HighlightField.fragments();
        //highlight title替换 替换goods中的title
        person.setAddress(fragments[0].toString());
        personList.add(person);
    }
    System.out.println(JSONObject.toJSONString(personList));
}

Copyright © 2023,版权所有 - 小太阳的博客 - 黑ICP备2023000004号