java集成ElasticSearch常用的API使用

  最近在研究Solr的替代解决方案,就研究了solr的同门师弟elasticsearch,同门是因为他俩都基于Lucene。

  ElasticSearch具有实时热更新,分布式,大数据量级的优势,相比于solr,肯定前景更开阔一些。

  先说部署,ElasticSearch官网直接下载最新版,我用的是7.10.1版本,直接进入bin目录下的ElasticSearch.bat双击运行即可,完事访问本地9200端口测试是否成功。

  head插件和Kibana插件还有ik分词器根据自己需求下载,head用于ElasticSearch索引及文档数据的可视化,kibana用于Rest命令测试,ik分词器帮助进行中文分词检索匹配

  话不多说,直接上代码

  先上maven依赖:

  我为了方便,引入了fastjson和mybatis generator,你根据自己需要

    <properties>
        <java.version>1.8</java.version>
        <!-- 指定ElasticSearch和自己部署的版本一致-->
        <elasticsearch.version>7.10.1</elasticsearch.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.70</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

  然后是获取 RestHighLevelClient

        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("127.0.0.1",9200,"http")));

  创建索引:

    /**
     * 创建索引(库)
     */
    @Test
    void CreateIndex() throws IOException {
        //创建请求
        CreateIndexRequest request = new CreateIndexRequest("testdemo");
        //下面是给这个索引添加映射规则(可选)
//        XContentBuilder mapping = JsonXContent.contentBuilder()
//                .startObject()
//                    .startObject("properties")
//                        //code字段
//                        .startObject("code")
//                            .field("type","keyword")
//                        .endObject()
//                        //name字段
//                        .startObject("name")
//                            .field("type","text")
//                        .endObject()
//                    .endObject()
//                .endObject();
//        request.mapping(mapping);
        
        CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
        System.out.println(createIndexResponse);

    }

  删除索引:

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

  判断索引是否存在:

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

  插入文档:

    /**
     * 添加document数据
     */
    @Test
    void inputalltable() throws IOException {
        IndexRequest indexRequest = new IndexRequest("testdemo");
        //设置你想要的id,不设置会自动生成随机uuid
        indexRequest.id("");
        //测试数据
        Map map= new HashMap();
        map.put("code","xxxxxxx“);
        map.put("name","xxxxxx");
        indexRequest.source(JSON.toJSONString(map), XContentType.JSON);
        IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT);
    }        

  批量添加文档:

    /**
     * bulkcreateDOC
     * 批量导入文档
     */
    @Test
    void CreateBulk() throws IOException {
        
        List<Map<String, String>> gettabledata = generolService.gettabledata(“testdemo”);
        if(gettabledata.size()!=0){//判断是否为空集合
            
            BulkRequest bulkRequest = new BulkRequest();
            for(int i=(tem-1)*50000;i<gettabledata.size();i++){
                bulkRequest.add(
                        new IndexRequest("testdemo")
                                .id(gettabledata.get(i).get("id"))
                                .source(JSON.toJSONString(gettabledata.get(i)),XContentType.JSON)
                );
            }
            client.bulk(bulkRequest,RequestOptions.DEFAULT);
            
        }

    }

  删除文档:

    /**
     * 删除文档
     */
    @Test
    void deleteDOCtest() throws IOException {
        //第一个参数为index名称,第二个参数是文档DOC的id值
        DeleteRequest request = new DeleteRequest("testdemo","xxxxxxxx");
        DeleteResponse delete = client.delete(request, RequestOptions.DEFAULT);
        System.out.println(delete.toString());
    }

  修改更新文档:

    /**
     * 更新文档
     */
    @Test
    void updateDOctest() throws IOException {
        UpdateRequest request = new UpdateRequest("testdemo","xxxxxxxxx");
        Map map= new HashMap();
        map.put("code","xxxxxxx“);
        map.put("name","xxxxxx");
        request.doc(JSON.toJSONString(map),XContentType.JSON);
        UpdateResponse update = client.update(request, RequestOptions.DEFAULT);
        System.out.println(update.status());
        

    }

  简单的检索(更复杂的检索请自行官网查询文档,包括match、trem、profix等和bool,must,should嵌套查询,from、size等分页)

    /**
     * 查询
     */
    @Test
    void select() throws IOException {
        SearchRequest searchRequest = new SearchRequest("testdemo");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//        MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
        QueryStringQueryBuilder queryBuilder = QueryBuilders.queryStringQuery("xx");
        searchSourceBuilder.query(queryBuilder);
        searchRequest.source(searchSourceBuilder);
        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);

        System.out.println(search.getHits().getTotalHits());
        
    }

  

  

原文地址:https://www.cnblogs.com/Monroyhahaha/p/14206914.html