java操作ELasticSearch

基于springboot:

user:

@Data //getset 
@AllArgsConstructor //有参构造函数
@NoArgsConstructor  //无参构造函数
@Component   //声明它是spring的一个组件
public class User {
    private String name;
    private int age;
}

  测试添加文档:

 @Test
    void testAddDocument() throws IOException {
        //创建对象
        User user = new User("ElasticSearch", 3);
        //创建请求
        IndexRequest request = new IndexRequest("index1");
        //规则
        request.id("1");
        request.timeout(TimeValue.timeValueSeconds(1));
        //将数据放入请求
        request.source(JSON.toJSONString(user), XContentType.JSON);
        //客户端发送请求
        IndexResponse index = client.index(request, RequestOptions.DEFAULT);
        System.out.println(index.toString());
        
    }

  结果:

测试文档是否存在

   @Test
    void testIsExists() throws IOException {
        GetRequest request = new GetRequest("index1", "1");
        //不获取 _source 上下文
        request.fetchSourceContext(new FetchSourceContext(false));
        boolean exists = client.exists(request, RequestOptions.DEFAULT);
        System.out.println(exists);
    }

  结果:

获取文档内容

  /*获取文档内容*/
    @Test
    void testGetDocument() throws IOException {
        GetRequest request = new GetRequest("index1", "1");
        GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
        System.out.println(getResponse.getSourceAsString());//打印文档内容
        System.out.println(getResponse);
    }  

 结果 :

 更新文档内容:

   @Test
    void testUpdateRequest() throws IOException {
        UpdateRequest request = new UpdateRequest("index1", "1");
        request.timeout("1s");
        User user = new User("ElasticSearch学习", 18);
        request.doc(JSON.toJSONString(user),XContentType.JSON);
        UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
        System.out.println(response.status());
    }

  结果:

 删除文档内容

    /*删除文档内容*/
    @Test
    void testDeleteRequest() throws IOException {
        DeleteRequest deleteRequest = new DeleteRequest("index1", "1");
        deleteRequest.timeout("1s");
        DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
        System.out.println(deleteResponse.status());
    }

  结果:

批量插入:

  /*批量插入*/
    @Test
    void testBulkRequest() throws IOException {
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.timeout("10s");
        ArrayList<Object> arrayList = new ArrayList<>();
        arrayList.add(new User("张三",12));
        arrayList.add(new User("李四",15));
        arrayList.add(new User("王五",22));
        arrayList.add(new User("赵七",26));
        arrayList.add(new User("王八",31));
        arrayList.add(new User("擎九",20));
        for (int i = 0; i <arrayList.size() ; i++) {
            bulkRequest.add(
                    new IndexRequest("index1")
                    .id(""+(i+1))  //id可要可不要
                            //转json数据
                    .source(JSON.toJSONString(arrayList.get(i)),XContentType.JSON));
        }
        BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println(bulk.hasFailures());//是否失败
    }

  结果:

 精确条件查询

//精确条件查询
    @Test
    void testSearch() throws IOException {
        SearchRequest searchRequest = new SearchRequest("index1");
        //构建搜索条件
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        //条件查询  如果查询条件为中文 需要在属性添加 .keyword 例如: QueryBuilders.termQuery("name.keyword","张三");
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name.keyword","张三");
        //查询所有
        MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
       // 分页
        /*一页多少条*/
        sourceBuilder.size(20);
        /*从第几个开始*/
        sourceBuilder.from(0);
        sourceBuilder.query(termQueryBuilder);
        //  sourceBuilder.query();查询所有
        //设置查询时间 如果过了60s将不再查询
        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());
        }
    }

  结果:

 模糊查询

 //模糊查询
    @Test
    void testFuzzyQuery() throws IOException{
        SearchRequest searchRequest = new SearchRequest("index1");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchQuery("name","张"));
        searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
        searchRequest.source(searchSourceBuilder);
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println(response.getHits());
        for (SearchHit searchHit : response.getHits().getHits()) {
            System.out.println(searchHit.getSourceAsMap());
        }
    }

  结果:

高亮搜索:

  //高亮搜索
    @Test
   void  testHighlightSearch() throws IOException {
        //搜索条件
       SearchRequest searchRequest = new SearchRequest("index");
       SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
       searchSourceBuilder .query(QueryBuilders.matchQuery("name.keyword","张三")) //精确匹配
                           .timeout(new TimeValue(60, TimeUnit.SECONDS))
                           .highlighter(new HighlightBuilder()
                           .field("name.keyword") //搜索字段
                           .requireFieldMatch(false) // 只需一个高亮
                           .preTags("<span style='coler:red'>")
                           .postTags("</span>"));
       //执行搜索
       searchRequest.source(searchSourceBuilder);
       SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
       //解析结果
       List<Object> queryList = new LinkedList<>();
       for (SearchHit documentFields : search.getHits().getHits()) {
           Map<String, Object> sourceAsMap = documentFields.getSourceAsMap();//原来的结果
           HighlightField field = documentFields.getHighlightFields().get("name.keyword");
           //解析高亮的字段,将原来的字段替换成高亮字段
           Text[] texts = field.fragments();
           String n_text ="";
           for (Text text : texts) {
               n_text+= text;
           }
           sourceAsMap.put("name",n_text);//高亮字段替换原来的内容
           queryList.add(sourceAsMap);

       }
       queryList.forEach((a)-> System.out.println(a));

   }

  结果:

原文地址:https://www.cnblogs.com/chenjiahao9527/p/13804379.html