博主
258
258
258
258
专辑

第十八节 Maven项目如何操作ElasticSearch

亮子 2023-08-19 06:00:43 535 0 0 0

1、添加依赖

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

2、kabana测试脚本

# 查看索引列表
GET _cat/indices

# 查看索引信息
GET /tb_hero

# 查看索引所有文档
GET /tb_hero/_search

# 根据ID查询文档
GET /tb_hero/_doc/101

# 检查安装的插件
GET _cat/plugins

# 删除索引
DELETE /tb_hero

# 测试分词效果
GET _analyze?pretty=true
{
  "text": "打虎"
}

3、实体类

package com.shenma2009.pojo;

import lombok.Data;

import java.io.Serializable;

/**
 * @author 军哥
 * @version 1.0
 * @description: TbHero
 * @date 2023/8/20 14:56
 */

@Data
public class TbHero implements Serializable {
    private Integer userId;
    private String userName;
    private Integer age;
    private String sex;
    private String userTech;
}

4、配置类

package com.shenma2009.config;

/**
 * @author 军哥
 * @version 1.0
 * @description: ElasticSearchConfig
 * @date 2023/8/20 9:14
 */

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class ElasticSearchConfig {
    @Bean
    public RestHighLevelClient restHighLevelClient(){
        HttpHost localhost = new HttpHost("192.168.80.131",9200,"http");
        RestClientBuilder builder = RestClient.builder(localhost);
        return new RestHighLevelClient(builder);
    }
}

5、注入client

@SpringBootTest
public class EsTestApp {

    @Autowired
    RestHighLevelClient restHighLevelClient;
}

6、Java API 操作ElasticSearch

1)、创建索引

    /**
     * @description 创建索引
     * @author 军哥
     * @date 2023/8/20 13:00
     * @version 1.0
     */
    @Test
    public void createIndex() throws IOException {
        // 定义索引请求
        String indexName = "tb_hero";
        CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName);

        // 定义索引映射
        XContentBuilder mapping = XContentFactory.jsonBuilder();
        mapping.startObject()
                .startObject("properties")
                .startObject("userId").field("type","long").endObject()
                .startObject("userName").field("type","keyword").endObject()
                .startObject("age").field("type","long").endObject()
                .startObject("sex").field("type","keyword").endObject()
                .startObject("userTech").field("type","text").field("analyzer", "ik_smart").endObject()
                .endObject()
                .endObject();

        createIndexRequest.mapping(mapping);
        //createIndexRequest.mapping("_doc", mapping);

        // 创建索引
        CreateIndexResponse response = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
        boolean acknowledged = response.isAcknowledged();
        System.out.println("Mapping creation acknowledged: " + acknowledged);

        // 获取索引的状态
        GetIndexResponse indexResponse = restHighLevelClient.indices().get(new GetIndexRequest(indexName), RequestOptions.DEFAULT);
        System.out.println(indexResponse.getAliases());
        System.out.println(indexResponse.getMappings().toString());
        System.out.println(indexResponse.getSettings());
    }

2)、删除索引

   /**
     * @description 删除索引
     * @author 军哥
     * @date 2023/8/20 14:44
     * @version 1.0
     */
    @Test
    public void deleteIndex() throws IOException {
        String indexName = "tb_hero";

        // 判断索引是否存在
        boolean exists = restHighLevelClient.indices().exists(new GetIndexRequest(indexName), RequestOptions.DEFAULT);
        if(!exists) {
            System.out.println("索引不存在:"+indexName);
            return;
        }
        // 删除索引
        AcknowledgedResponse delete = restHighLevelClient.indices().delete(new DeleteIndexRequest(indexName), RequestOptions.DEFAULT);
        if(delete.isAcknowledged()) {
            System.out.println("索引已经删除");
        }
        else {
            System.out.println("索引删除失败");
        }
    }

3)、添加文档

   /**
     * @description 增加记录
     * @author 军哥
     * @date 2023/8/20 17:18
     * @version 1.0
     */
    @Test
    public void insertDoc() throws IOException {
        String indexName = "tb_hero";

        TbHero tbHero = new TbHero();
        tbHero.setUserId(101);
        tbHero.setUserName("鲁智深");
        tbHero.setAge(33);
        tbHero.setSex("男");
        tbHero.setUserTech("倒拔垂杨柳");

        IndexRequest indexRequest = new IndexRequest();
        indexRequest.index(indexName).id(""+tbHero.getUserId());

        ObjectMapper mapper = new ObjectMapper();
        String s = mapper.writeValueAsString(tbHero);

        indexRequest.source(s, XContentType.JSON);

        IndexResponse index = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
        System.out.println("" + index.toString());
    }

4)、修改文档

   /**
     * @description 更新文档
     * @author 军哥
     * @date 2023/8/20 17:35
     * @version 1.0
     */
    @Test
    public void updateDoc() throws IOException {
        String indexName = "tb_hero";

        UpdateRequest updateRequest = new UpdateRequest();
        updateRequest.index(indexName).id("101");
        updateRequest.doc(XContentType.JSON, "userTech", "拳打镇关西");

        UpdateResponse response = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);

        System.out.println(response.toString());
    }

5)、根据ID读取单个文档

    /**
     * @description 根据ID读取单个文档
     * @author 军哥
     * @date 2023/8/20 17:46
     * @version 1.0
     */
    @Test
    public void selectDoc() throws IOException {
        String indexName = "tb_hero";

        GetRequest request = new GetRequest();
        request.index(indexName).id("101");
        GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);

        System.out.println(response.getSourceAsString());

        ObjectMapper objectMapper = new ObjectMapper();
        TbHero tbHero = objectMapper.readValue(response.getSourceAsString(), TbHero.class);
        System.out.println(tbHero.toString());

    }

6)、删除单个文档

   /**
     * @description 删除单个文档
     * @author 军哥
     * @date 2023/8/20 17:52
     * @version 1.0
     */
    @Test
    public void deleteDoc() throws IOException {
        String indexName = "tb_hero";

        DeleteRequest request = new DeleteRequest();
        request.index(indexName).id("101");

        DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);

        System.out.println(response.toString());

    }

7)、批量插入文档

   /**
     * @description 批量插入文档
     * @author 军哥
     * @date 2023/8/20 17:52
     * @version 1.0
     */

    @Test
    public void insertDocs() throws IOException {
        // 索引名字
        String indexName = "tb_hero";

        // 准备多个数据
        ArrayList<TbHero> tbHeroes = new ArrayList<>();

        TbHero tbHero1 = new TbHero();
        tbHero1.setUserId(101);
        tbHero1.setUserName("鲁智深");
        tbHero1.setSex("男");
        tbHero1.setAge(33);
        tbHero1.setUserTech("倒拔垂杨柳");

        TbHero tbHero2 = new TbHero();
        tbHero2.setUserId(102);
        tbHero2.setUserName("武松");
        tbHero2.setSex("男");
        tbHero2.setAge(33);
        tbHero2.setUserTech("景阳冈打虎");

        tbHeroes.add(tbHero1);
        tbHeroes.add(tbHero2);

        // 准备请求
        BulkRequest bulkRequest = new BulkRequest();
        ObjectMapper mapper = new ObjectMapper();

        tbHeroes.forEach(item -> {
            IndexRequest indexRequest = new IndexRequest();

            String s = null;
            try {
                indexRequest.index(indexName).id(""+item.getUserId());

                s = mapper.writeValueAsString(item);
                indexRequest.source(s, XContentType.JSON);

                bulkRequest.add(indexRequest);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        });

        BulkResponse response = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println(response.toString());
    }

8)、批量删除文档

    /**
     * @description 批量删除
     * @author 军哥
     * @date 2023/8/20 18:20
     * @version 1.0
     */
    @Test
    public void deleteDocs() throws IOException {
        // 索引名字
        String indexName = "tb_hero";

        BulkRequest bulkRequest = new BulkRequest();

        bulkRequest.add(new DeleteRequest().index(indexName).id("101"));
        bulkRequest.add(new DeleteRequest().index(indexName).id("102"));

        BulkResponse response = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println(response.toString());
    }

9)、全量查询

    /**
     * @description 全量查询
     * @author 军哥
     * @date 2023/8/20 18:26
     * @version 1.0
     */
    @Test
    public void queryAll() throws IOException {
        // 索引名字
        String indexName = "tb_hero";

        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices(indexName);

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());

        searchRequest.source(searchSourceBuilder);

        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        TotalHits total = response.getHits().getTotalHits();
        System.out.println("总记录数为:"+total);

        ObjectMapper mapper = new ObjectMapper();
        SearchHit[] hits = response.getHits().getHits();
        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();
            TbHero tbHero = mapper.readValue(source, TbHero.class);

            System.out.println(tbHero.toString());
        }
    }

10)、精确查询+分页+排序+字段查询

   /**
     * @description 精确查询+分页+排序+字段查询
     * @author 军哥
     * @date 2023/8/20 18:42
     * @version 1.0
     */
    @Test
    public void termQuery() throws IOException {
        // 索引名字
        String indexName = "tb_hero";

        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices(indexName);

        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.termQuery("sex", "男"));

        // 分页+排序
        builder.from(0).size(10).sort("userId", SortOrder.DESC);

        // 字段查询
        String includes[] = {"userName", "sex"};
        String excludes[] = {"sex"};
        builder.fetchSource(includes, excludes);

        searchRequest.source(builder);

        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        TotalHits total = response.getHits().getTotalHits();
        System.out.println("总记录数为:"+total);

        ObjectMapper mapper = new ObjectMapper();
        SearchHit[] hits = response.getHits().getHits();
        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();
            TbHero tbHero = mapper.readValue(source, TbHero.class);

            System.out.println(tbHero.toString());
        }
    }

11)、多条件查询

    /**
     * @description 多条件查询
     * @author 军哥
     * @date 2023/8/20 21:03
     * @version 1.0
     */
    @Test
    public void boolQuery() throws IOException {
        // 索引名字
        String indexName = "tb_hero";

        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices(indexName);

        SearchSourceBuilder builder = new SearchSourceBuilder();

        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

        boolQueryBuilder.must(QueryBuilders.termQuery("age", 33));
        boolQueryBuilder.must(QueryBuilders.termQuery("userName", "武松"));

        builder.query(boolQueryBuilder);
        searchRequest.source(builder);

        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        TotalHits total = response.getHits().getTotalHits();
        System.out.println("总记录数为:"+total);

        ObjectMapper mapper = new ObjectMapper();
        SearchHit[] hits = response.getHits().getHits();
        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();
            TbHero tbHero = mapper.readValue(source, TbHero.class);

            System.out.println(tbHero.toString());
        }
    }

12)、区间查询

    /**
     * @description 区间查询
     * @author 军哥
     * @date 2023/8/20 21:12
     * @version 1.0
     */
    @Test
    public void rangeQuery() throws IOException {
        // 索引名字
        String indexName = "tb_hero";

        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices(indexName);

        SearchSourceBuilder builder = new SearchSourceBuilder();

        RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("userId").lte(200).gte(100);
        builder.query(rangeQueryBuilder);

        searchRequest.source(builder);

        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        TotalHits total = response.getHits().getTotalHits();
        System.out.println("总记录数为:"+total);

        ObjectMapper mapper = new ObjectMapper();
        SearchHit[] hits = response.getHits().getHits();
        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();
            TbHero tbHero = mapper.readValue(source, TbHero.class);

            System.out.println(tbHero.toString());
        }
    }

13)、模糊查询

    /**
     * @description 模糊查询
     * @author 军哥
     * @date 2023/8/20 21:21
     * @version 1.0
     */
    @Test
    public void fuzzyQuery() throws IOException {
        // 索引名字
        String indexName = "tb_hero";

        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices(indexName);

        SearchSourceBuilder builder = new SearchSourceBuilder();

        FuzzyQueryBuilder fuzziness = QueryBuilders.fuzzyQuery("userName", "武").fuzziness(Fuzziness.ONE);
        builder.query(fuzziness);

        searchRequest.source(builder);

        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        TotalHits total = response.getHits().getTotalHits();
        System.out.println("总记录数为:"+total);

        ObjectMapper mapper = new ObjectMapper();
        SearchHit[] hits = response.getHits().getHits();
        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();
            TbHero tbHero = mapper.readValue(source, TbHero.class);

            System.out.println(tbHero.toString());
        }
    }

14)、高亮查询

   /**
     * @description 高亮查询
     * @author 军哥
     * @date 2023/8/20 21:36
     * @version 1.0
     */
    @Test
    public void highLightQuery() throws IOException {
        // 索引名字
        String indexName = "tb_hero";

        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices(indexName);

        SearchSourceBuilder builder = new SearchSourceBuilder();

        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("userTech", "柳虎");

        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.preTags("<font color='red'>");
        highlightBuilder.postTags("</font>");
        highlightBuilder.field("userTech");
        builder.highlighter(highlightBuilder);

        builder.query(matchQueryBuilder);

        searchRequest.source(builder);

        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        TotalHits total = response.getHits().getTotalHits();
        System.out.println("总记录数为:"+total);

        ObjectMapper mapper = new ObjectMapper();
        SearchHit[] hits = response.getHits().getHits();
        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();
            TbHero tbHero = mapper.readValue(source, TbHero.class);

            HighlightField techName = hit.getHighlightFields().get("userTech");
            if(techName != null) {
                String string = techName.getFragments()[0].string();
                tbHero.setUserTech(string);
            }

            System.out.println(tbHero.toString());
        }

    }