java操作es之rest风格基本操作

ES基本操作

1、注入RestHighLevelClient

@Configuration
public class ElasticSearchClientConfig {
    @Bean
    public RestHighLevelClient restHighLevelClient(){
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("39.105.145.159",9200,"http"))
        );
        return client;
    }
}

2、操作索引

注入RestHighLevelClient

@Autowired
@Qualifier("restHighLevelClient")
RestHighLevelClient client;

2.1、创建索引

​ PUT index

void testIndex() {
        //1.创建索引的请求
        CreateIndexRequest request = new CreateIndexRequest("test_index");
        //2客户端执行请求,请求后获得响应
        CreateIndexResponse response = null;
        try {
            response = client.indices().create(request, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(response);
    }

2.2、测试索引是否存在 GET index

void testExistIndex() throws IOException {
    //1.创建索引的请求
    GetIndexRequest request = new GetIndexRequest("test_index");
    //2客户端执行请求,请求后获得响应
    boolean exist =  client.indices().exists(request, RequestOptions.DEFAULT);
    System.out.println("测试索引是否存在-----"+exist);
}

2.3、删除索引 DELETE index

void testDeleteIndex() throws IOException {
    DeleteIndexRequest request = new DeleteIndexRequest("test_index");
    AcknowledgedResponse delete = client.indices().delete(request, RequestOptions.DEFAULT);
    System.out.println("删除索引--------" + delete.isAcknowledged());
}

3、文档操作

3.1、添加文档

void testAddDocument() throws IOException {
    //创建对象
    User user = new User("小明",18);
    //创建请求
    IndexRequest request = new IndexRequest("test_index");
    //制定规则
    request.id("1");//id
    request.timeout(TimeValue.timeValueSeconds(1));//过期时间
    //request.timeout("1s");

    //将数据放入请求
    request.source(JSON.toJSONString(user), XContentType.JSON);
    //客户端发送请求
    IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);

}

3.2、获取文档,查看是否存在

void testIsExists() throws IOException {
    GetRequest getRequest = new GetRequest("test_index", "1");
    getRequest.fetchSourceContext(new FetchSourceContext(false));//不获取_source的上下文,效率更高
    getRequest.storedFields("_none_");

    boolean exists = client.exists(getRequest,RequestOptions.DEFAULT);
    System.out.println(exists);

}

3.3、获取文档信息

void testGetDocument() throws IOException{
    GetRequest getRequest = new GetRequest("test_index", "1");
    GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
    System.out.println(getResponse.getSourceAsString());//打印文档内容
    System.out.println(getResponse);//返回的全部内容和命令获取的是一样的
}

3.4、更新文档

void testUpdateDocument() throws IOException{
    UpdateRequest updateRequest = new UpdateRequest("test_index", "1");
    updateRequest.timeout("1s");
    User user = new User("小明", 10);
    updateRequest.doc(JSON.toJSONString(user),XContentType.JSON);
    UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT);
    System.out.println(update.status());
    System.out.println(update);
}

3.5、删除1号文档

void testDeleteDocument() throws IOException{
    DeleteRequest deleteRequest = new DeleteRequest("test_index", "1");
    deleteRequest.timeout("1s");
    DeleteResponse delete = client.delete(deleteRequest, RequestOptions.DEFAULT);
    System.out.println(delete);
    System.out.println(delete.status());
}

3.6、批量插入数据

void testBulkDocument() throws IOException {
    BulkRequest bulkRequest = new BulkRequest();
    bulkRequest.timeout("10s");//数据越大时间越多

    ArrayList<User> arrayList = new ArrayList<>();
    arrayList.add(new User("小明",10));
    arrayList.add(new User("小红",11));
    arrayList.add(new User("小1",12));
    arrayList.add(new User("小2",13));
    arrayList.add(new User("小3",14));
    arrayList.add(new User("小4",15));

    //批处理请求
    for(int i = 0;i<arrayList.size();i++){
        bulkRequest.add(
                new IndexRequest("test_index")
                        .id(""+(i+1))
                .source(JSON.toJSONString(arrayList.get(i)),XContentType.JSON)
        );
    }
    BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT);
    System.out.println(bulk.hasFailures());//是否失败  false:成功    true:失败

}

3.7、查询,分页,高亮

void testSearch() throws IOException {
    ArrayList<Map<String,Object>> list = new ArrayList<>();
    SearchRequest searchRequest = new SearchRequest("test_index");
    //构建搜索条件
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

    //查询条件,可以使用QueryBuilders  因为中文愿意查不出中文,所以将name改为name.keyword,也可以安装ik分词器
    TermQueryBuilder termQuery = QueryBuilders.termQuery("name.keyword", "小红");//精确查询
    sourceBuilder.query(termQuery);


    //匹配所有
    /*MatchAllQueryBuilder allQueryBuilder = QueryBuilders.matchAllQuery();
    sourceBuilder.query(allQueryBuilder);*/


    //在60s内查询出来
    sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));

    //分页
    sourceBuilder.from(0);
    sourceBuilder.size(4);

    //高亮显示
    HighlightBuilder highlightBuilder = new HighlightBuilder();
    highlightBuilder.field("name.keyword");
    highlightBuilder.requireFieldMatch(false);  //多个单词高亮的话,要把这个设置为trues
    highlightBuilder.preTags("<span style='color:red'>");
    highlightBuilder.postTags("</span>");
    sourceBuilder.highlighter(highlightBuilder);

    //执行搜索
    searchRequest.source(sourceBuilder);
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);//执行请求

    for (SearchHit hit : searchResponse.getHits().getHits()) {
        //解析高亮,用高亮替换原来的
        Map<String, HighlightField> highlightFields = hit.getHighlightFields();
        HighlightField name = highlightFields.get("name.keyword");
        Map<String, Object> sourceAsMap = hit.getSourceAsMap();//原来的结果
        if(name!=null){
            Text[] fragments = name.fragments();
            StringBuilder newName = new StringBuilder();
            for (Text text : fragments) {
                newName.append(text);
            }
            sourceAsMap.put("name", newName.toString());
            list.add(sourceAsMap);
        }
    }
    System.out.println(list.toString());
}

4、查询

4.1、整体结构

  • 注入RestHighLevelClient

    @Autowired
    @Qualifier("restHighLevelClient")
    RestHighLevelClient client;
    
  • 搜索框架

    void findByName() throws IOException {
      SearchRequest searchRequest = new SearchRequest("test_index");
      //构建搜索条件
      SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
      //存储多个条件
      BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
      //构建条件
      TermQueryBuilder query1 = QueryBuilders.termQuery("name.keyword","小明");
      //条件放入
      queryBuilder.should(query1);
      //多条件引入
      sourceBuilder.query(queryBuilder);
      //进行分页
      sourceBuilder.from(0);
      sourceBuilder.size(6);
      //条件进入请求
      searchRequest.source(sourceBuilder);
      //执行查询
      SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
      //解析查询结果
      for (SearchHit hit : search.getHits().getHits()) {
          System.out.println(hit.getSourceAsMap().toString());
      }
    }
    

4.2、常用条件查询

4.2.1、精度匹配查询 termQuery

TermQueryBuilder query1 = QueryBuilders.termQuery("name.keyword","小明");

根据名字查询,查询name,加上keyword是由于中文匹配,keyword不会进行分词,才能够进行查询,不加keyword默认是text,会进行分词

4.2.2、匹配查询(分词)matchQuery

MatchQueryBuilder name = QueryBuilders.matchQuery("name", "小明");

查询结果:image-20211214175146362

它会将“小明”分为“小”与“明”进行查询,所以将“小兰”也查出来了

4.2.3、精确查询 queryString

//构建条件
QueryStringQueryBuilder name = new QueryStringQueryBuilder("小兰").field("name").defaultOperator(Operator.AND);

使用QueryStringQueryBuilder构造查询条件,不用keyword也可以精确查询。

4.2.4、模糊查询 wildcardQuery

WildcardQueryBuilder wildcardQuery = QueryBuilders.wildcardQuery("name.keyword", String.format("*%s*", "小"));

查询结果:image-20211214175906801

小字进行模糊查询。

4.2.5、范围查询 rangeQuery

RangeQueryBuilder age = QueryBuilders.rangeQuery("age").from(12, true).to(15, true);

后面的true表示包含当前值即:[12,15],若为false则为(12,15)。

4.2.6、多条件合并查询

//搜索条件WildcardQueryBuilder wildcardQuery1 = QueryBuilders.wildcardQuery("name.keyword", String.format("*%s*", "小"));WildcardQueryBuilder wildcardQuery2 = QueryBuilders.wildcardQuery("name.keyword", String.format("*%s*", "兰"));queryBuilder.must(wildcardQuery1).must(wildcardQuery2);

查询结果:image-20211214180923342

这里使用的是must进行合并查询,代表and,使用should即代表or,可以分开写也可以合在一条语句。

保存笔记,以后总能用得着。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java直接使用DSL操作ES,可以使用Elasticsearch Java High Level REST Client,该客户端提供了一套用于操作ESJava API,可以直接使用DSL语句进行操作。 以下是一个简单的示例代码,演示了如何使用DSL语句查询文档: ```java RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http"))); SearchRequest searchRequest = new SearchRequest("index"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchQuery("field", "value")); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); SearchHits hits = searchResponse.getHits(); for (SearchHit hit : hits.getHits()) { String sourceAsString = hit.getSourceAsString(); System.out.println(sourceAsString); } client.close(); // 关闭连接 ``` 以上示例代码使用`RestHighLevelClient`实例创建了一个查询请求,并使用`SearchSourceBuilder`构建了查询条件,然后执行查询请求并打印查询结果。需要注意的是,具体的查询条件和操作方式需要根据实际需求进行调整。 ### 回答2: Java是一种面向对象的编程语言,而DSL(Domain Specific Language)是一种用于特定领域的编程语言。在使用Java操作ElasticsearchES)时,我们可以直接使用Java提供的API来进行操作,而不需要使用DSL。 Java提供了一系列用于操作ES的API,其中最常用的是Elasticsearch Java High-Level REST Client。通过使用这个API,我们可以直接使用Java代码来连接ES集群并执行各种操作,包括索引数据、搜索数据、更新数据等。 使用Java API操作ES相对于使用DSL的优势在于: 1. Java代码更容易维护和调试,因为我们可以使用Java IDE的各种功能来辅助我们开发和调试代码。 2. Java代码更容易与其他Java组件和库进行集成,可以方便地将ES操作与其他业务逻辑结合起来,实现更复杂的功能。 3. Java代码更易于扩展和重用,我们可以将常见的操作封装成独立的方法或类,供其他地方调用,减少重复劳动。 当然,使用DSL操作ES也有一些优势,比如,DSL语法更接近于自然语言,更容易理解和书写,尤其是在复杂的查询场景下。此外,DSL还提供了一些高级查询和聚合功能,更适合一些特定的业务需求。 总之,Java可以直接使用API操作ES,而不需要使用DSL。选择使用哪种方式主要取决于具体的需求和项目情况。 ### 回答3: Java可以直接使用DSL(领域特定语言)来操作ElasticsearchES)。Elasticsearch是一个分布式的、实时的、可扩展的搜索和分析引擎,它使用JSON风格的DSL来与其进行交互。 在Java中,我们可以使用Elasticsearch提供的Java High Level REST Client来与ES进行交互,并使用Java的DSL来构建搜索查询和索引操作。 使用Java的DSL,我们可以灵活地构建复杂的查询语句。例如,我们可以使用诸如bool、match和range等查询子句来执行布尔逻辑、文本匹配和范围查询。DSL还支持聚合查询,可以进行分组、统计和计算相关性等操作。 以下是一个使用Java DSL进行ES搜索的示例: ```java SearchRequest searchRequest = new SearchRequest("index_name"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchQuery("field_name", "value")); searchRequest.source(searchSourceBuilder); try { SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); // 处理搜索结果 } catch (IOException e) { // 异常处理 } ``` 在上述示例中,我们创建了一个搜索请求,并使用DSL构建器构建了一个简单的匹配查询。然后,我们使用Elasticsearch客户端执行搜索请求,并获取搜索结果。 除了搜索操作,我们还可以使用Java DSL执行索引、更新和删除等操作。通过使用ESJava高级客户端,我们可以直接在Java应用中使用Java DSL来操作ES,从而避免了手动构建和解析JSON查询语句的复杂性。 总之,Java可以直接使用DSL来操作Elasticsearch,通过使用es提供的Java高级客户端,我们可以方便地使用Java DSL构建与ES交互的操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值