国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

elasticsearch(es)高級查詢api

這篇具有很好參考價值的文章主要介紹了elasticsearch(es)高級查詢api。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

yml配置

  #es配置
spring:
  elasticsearch:
    rest:
      uris: 192.168.16.188:9200

添加依賴

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

使用編程的形式設置連接的ES服務器,并獲取客戶端對象,配置ES服務器地址與端口9200,記得客戶端使用完畢需要手工關閉。由于當前客戶端是手工維護的,因此不能通過自動裝配的形式加載對象

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringBootTest.class)
public class JeecgTest {
    @Test
//    @SneakyThrows
    public void name() {

        HttpHost host = HttpHost.create("http://localhost:9200");
        RestClientBuilder builder = RestClient.builder(host);

        client = new RestHighLevelClient(builder);

        try {
            client.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
   }
}

使用客戶端對象操作ES,例如創(chuàng)建索引

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringBootTest.class)
public class JeecgTest {
    private RestHighLevelClient client;
      @Test
      void testCreateIndex() throws IOException {
          HttpHost host = HttpHost.create("http://localhost:9200");
          RestClientBuilder builder = RestClient.builder(host);
          client = new RestHighLevelClient(builder);
        
          CreateIndexRequest request = new CreateIndexRequest("books");
          client.indices().create(request, RequestOptions.DEFAULT); 
        
          client.close();
      }
}

添加文檔,添加文檔使用的請求對象是IndexRequest,與創(chuàng)建索引使用的請求對象不同

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringBootTest.class)
public class JeecgTest {
    @Test
    public void testCreateIndex() throws IOException {
        HttpHost host = HttpHost.create("http://192.168.16.188:9200");
        RestClientBuilder builder = RestClient.builder(host);
        client = new RestHighLevelClient(builder);
        HashMap<String, Object> map = new HashMap<>();
        map.put("name", "張三");
        map.put("age", 20);
        IndexRequest request = new IndexRequest("user");
        String json = JSON.toJSONString(map);
        request.source(json, XContentType.JSON);
        IndexResponse index = client.index(request, RequestOptions.DEFAULT);
        client.close();
    }
}

/增量更新文檔

  @Test
  public void testUpdateDoc() throws IOException {
      HttpHost host = HttpHost.create("http://192.168.16.188:9200");
      RestClientBuilder builder = RestClient.builder(host);
      client = new RestHighLevelClient(builder);
      UpdateRequest updateRequest = new UpdateRequest("user", "88");
      updateRequest.timeout("1s");
      User user = new User();
      user.setAge(222);
      updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);
      UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT);
      client.close();
  }

批量添加文檔:批量做時,先創(chuàng)建一個BulkRequest的對象,可以將該對象理解為是一個保存request對象的容器,將所有的請求都初始化好后,添加到BulkRequest對象中,再使用BulkRequest對象的bulk方法,一次性執(zhí)行完畢

    @Test
    //批量添加文檔
    public void testCreateDocAll() throws IOException {
        HttpHost host = HttpHost.create("http://192.168.16.188:9200");
        RestClientBuilder builder = RestClient.builder(host);
        client = new RestHighLevelClient(builder);
        List<Map> list = new ArrayList<>();
        HashMap<String, Object> map = new HashMap<>();
        for (int i = 0; i < 3; i++) {
            map.put("aa" + i, i);
            list.add(map);
        }
        BulkRequest bulk = new BulkRequest();
        for (Map map1 : list) {
            IndexRequest request = new IndexRequest("user");
            String json = JSON.toJSONString(map1);
            request.source(json, XContentType.JSON);
            bulk.add(request);
        }
        client.bulk(bulk, RequestOptions.DEFAULT);
        client.close();
    }

按id查詢1文檔:根據(jù)id查詢文檔使用的請求對象是GetRequest

    @Test
    //按id查詢
    public void getById() throws IOException {
        HttpHost host = HttpHost.create("http://192.168.16.188:9200");
        RestClientBuilder builder = RestClient.builder(host);
        client = new RestHighLevelClient(builder);
        GetRequest request = new GetRequest("user", "88");
        GetResponse response = client.get(request, RequestOptions.DEFAULT);
        String json = response.getSourceAsString();
        System.out.println(json);
        client.close();
    }

通過id查詢2

    @Test
    //按id查詢
    public void getById2() throws IOException {
        HttpHost host = HttpHost.create("http://192.168.16.188:9200");
        RestClientBuilder builder = RestClient.builder(host);
        client = new RestHighLevelClient(builder);
        SearchRequest request = new SearchRequest("user");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.termQuery("_id",88));
        request.source(searchSourceBuilder);
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();
            System.out.println(source);
        }
        client.close();
    }

按條件查詢文檔:按條件查詢文檔使用的請求對象是SearchRequest,查詢時調用SearchRequest對象的termQuery方法,需要給出查詢屬性名,此處支持使用合并字段,也就是前面定義索引屬性時添加的all屬性

    @Test
    //按條件查詢
    public void getBySearch() throws IOException {
        HttpHost host = HttpHost.create("http://192.168.16.188:9200");
        RestClientBuilder builder = RestClient.builder(host);
        client = new RestHighLevelClient(builder);
        SearchRequest request = new SearchRequest("user");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchPhraseQuery("name","張三"));
        request.source(searchSourceBuilder);
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();
            System.out.println(source);
        }
        client.close();
    }

按條件高亮查詢

    @Test
    //按條件高亮查詢
    public void getBySearch2() throws IOException {
        HttpHost host = HttpHost.create("http://192.168.16.188:9200");
        RestClientBuilder builder = RestClient.builder(host);
        client = new RestHighLevelClient(builder);
        SearchRequest request = new SearchRequest("user");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchPhraseQuery("name","張三"));
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        searchSourceBuilder.highlighter(highlightBuilder.field("name"));
        request.source(searchSourceBuilder);
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            System.out.println(highlightFields);
        }
        client.close();
    }

全文高亮查詢

    @Test
    //全文高亮查詢
    public void getBySearch2() throws IOException {
        HttpHost host = HttpHost.create("http://192.168.16.188:9200");
        RestClientBuilder builder = RestClient.builder(host);
        client = new RestHighLevelClient(builder);
        SearchRequest request = new SearchRequest("user");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.multiMatchQuery("張三"));
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        searchSourceBuilder.highlighter(highlightBuilder.field("*"));
        request.source(searchSourceBuilder);
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            System.out.println(highlightFields);
        }
        client.close();
    }

分頁查詢

    @Test
    //分頁查詢
    public void getBySearch3() throws IOException {
        // 開始查詢的記錄數(shù)
        //頁碼
        Integer pageNum=1;
        //頁數(shù)
        Integer pageSize=2;
        int start = (pageNum - 1) * pageSize;
        HttpHost host = HttpHost.create("http://192.168.16.188:9200");
        RestClientBuilder builder = RestClient.builder(host);
        client = new RestHighLevelClient(builder);
        SearchRequest request = new SearchRequest("user");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        searchSourceBuilder.from(start);
        searchSourceBuilder.size(pageSize);
        request.source(searchSourceBuilder);
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            String sourceAsString = hit.getSourceAsString();
            System.out.println(sourceAsString);
        }
        client.close();
    }

MultiQuery 全部字段聯(lián)合搜索

    @Test
    // MultiQuery 全部字段聯(lián)合搜索 
    public void getBySearch4() throws IOException {
        HttpHost host = HttpHost.create("http://192.168.16.188:9200");
        RestClientBuilder builder = RestClient.builder(host);
        client = new RestHighLevelClient(builder);
        SearchRequest request = new SearchRequest("user");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.multiMatchQuery("三"));
        request.source(searchSourceBuilder);
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();
            System.out.println(source);
        }
        client.close();
    }

MultiQuery 多字段聯(lián)合搜索 ,使用多字段查詢的時候,查詢的字段要和查詢的內容類型一直,不然就會報錯,類似age字段是int類型,和name字段是string類型查詢就會報錯

    @Test
    // MultiQuery 多字段聯(lián)合搜索
    public void getBySearch5() throws IOException {
        HttpHost host = HttpHost.create("http://192.168.16.188:9200");
        RestClientBuilder builder = RestClient.builder(host);
        client = new RestHighLevelClient(builder);
        SearchRequest request = new SearchRequest("user");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.multiMatchQuery("王","name","file"));
        request.source(searchSourceBuilder);
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();
            System.out.println(source);
        }
        client.close();
    }

多域聯(lián)合查詢的時候,可以通過 boost 來設置某個域在計算得分時候的比重,比重越高的域當他符合條件時計算的得分越高,相應的該記錄也更靠前。通過在 fields 中給相應的字段用 ^權重倍數(shù)來實現(xiàn)

	@Test
    // MultiQuery 多字段聯(lián)合搜索和設置權重
    public void getBySearch6() throws IOException {
        HttpHost host = HttpHost.create("http://192.168.16.188:9200");
        RestClientBuilder builder = RestClient.builder(host);
        client = new RestHighLevelClient(builder);
        SearchRequest request = new SearchRequest("user");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.multiMatchQuery("廣","name","address").field("name",10));
        request.source(searchSourceBuilder);
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();
            System.out.println(source);
        }
        client.close();
    }

如果我們既要對一些字段進行分詞查詢,同時要對另一些字段進行精確查詢,就需要使用布爾查詢來實現(xiàn)了。布爾查詢對應于Lucene的BooleanQuery查詢,實現(xiàn)將多個查詢組合起來,有三個可選的參數(shù):must:文檔必須匹配must所包括的查詢條件,相當于 “AND”should:文檔應該匹配should所包括的查詢條件其中的一個或多個,相當于 "OR"must_not:文檔不能匹配must_not所包括的該查詢條件,相當于“NOT”

```erlang
GET user/_search
{
    "query": {
        "bool": { // 布爾查詢
            "must": [ // 查詢條件 must 表示數(shù)組中的查詢方式所規(guī)定的條件都必須滿足
                {
                    "multi_match": {
                        "query": "王小妹",
                        "minimum_should_match": "50%",
                        "fields": [
                            "name^10",
                            "title"
                        ]
                    }
                },
                {
                    "match": {
                        "address": "廣州"
                    }
                }
            ]
        }
    }
}
    @Test
    // 布爾查詢 BoolQuery
    public void getBySearch7() throws IOException {
        HttpHost host = HttpHost.create("http://192.168.16.188:9200");
        RestClientBuilder builder = RestClient.builder(host);
        client = new RestHighLevelClient(builder);
        SearchRequest request = new SearchRequest("user");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        // 搜索方式
        // 首先構造多關鍵字查詢條件
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("王小妹", "name", "title").field("name", 10);
        // 然后構造匹配查詢條件
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("address", "廣州");
        // 組合兩個條件,組合方式為 must 全滿足
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(multiMatchQueryBuilder);
        boolQueryBuilder.must(matchQueryBuilder);
        // 將查詢條件封裝給查詢對象
        searchSourceBuilder.query(boolQueryBuilder);
        request.source(searchSourceBuilder);
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();
            System.out.println(source);
        }
        client.close();
    }

定義過濾器查詢,是在原本查詢結果的基礎上對數(shù)據(jù)進行篩選,因此省略了重新計算的分的步驟,效率更高。并且方便緩存。推薦盡量使用過慮器去實現(xiàn)查詢或者過慮器和查詢共同使用,過濾器在布爾查詢中使用,下邊是在搜索結果的基礎上進行過濾:

GET user/_search
{
    "query": {
        "bool": {
            "must": [
                {
                    "multi_match": {
                        "query": "王小妹",
                        "minimum_should_match": "50%",
                        "fields": [
                            "name^10",
                            "title"
                        ]
                    }
                }
            ],
            "filter": [
                {
                    // 過濾條件:studymodel 必須是 201001
                    "match": {"address": "廣州"}
                },
                {
                    // 過濾條件:年齡 >=10 <=100
                    "range": {"age": {"gte": 10,"lte": 100}}
                }
            ]
        }
    }
}
    @Test
    // 過濾器
    public void getBySearch8() throws IOException {
        HttpHost host = HttpHost.create("http://192.168.16.188:9200");
        RestClientBuilder builder = RestClient.builder(host);
        client = new RestHighLevelClient(builder);
        SearchRequest request = new SearchRequest("user");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        // 搜索方式
        // 首先構造多關鍵字查詢條件
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("王小妹", "name", "title").field("name", 10);
        // 構造匹配查詢條件
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("address", "廣州");
        // 構造范圍查詢條件
        RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").gt(10).lt(100);
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(multiMatchQueryBuilder);
        boolQueryBuilder.filter(matchQueryBuilder);
        boolQueryBuilder.filter(rangeQueryBuilder);
        // 將查詢條件封裝給查詢對象
        searchSourceBuilder.query(boolQueryBuilder);
        request.source(searchSourceBuilder);
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();
            System.out.println(source);
        }
        client.close();
    }

注意:range和term一次只能對一個Field設置范圍過慮

排序,在查詢的結果上進行二次排序,支持對 keyword、date、float 等類型添加排序,text類型的字段不允許排序

GET user/_search
{
    "query": {
        "bool": {
            "filter": [
                {
                    "range": {
                        "age": {
                            "gte": 10,
                            "lte": 100
                        }
                    }
                }
            ]
        }
    },
    "sort": [
        {
            "age": "desc" 
        }
    ]
}

    @Test
    // 排序
    public void getBySearch9() throws IOException {
        HttpHost host = HttpHost.create("http://192.168.16.188:9200");
        RestClientBuilder builder = RestClient.builder(host);
        client = new RestHighLevelClient(builder);
        SearchRequest request = new SearchRequest("user");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        // 構造范圍查詢條件
        RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").gt(10).lt(100);
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.filter(rangeQueryBuilder);
        searchSourceBuilder.sort("age", SortOrder.DESC);
        // 將查詢條件封裝給查詢對象
        searchSourceBuilder.query(boolQueryBuilder);
        request.source(searchSourceBuilder);
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();
            System.out.println(source);
        }
        client.close();
    }

根據(jù)查詢條件來刪除

@Test
    // 根據(jù)條件物理刪除
    public void deleteBySearch() throws IOException {
        HttpHost host = HttpHost.create("http://192.168.16.188:9200");
        RestClientBuilder builder = RestClient.builder(host);
        client = new RestHighLevelClient(builder);
        DeleteByQueryRequest request = new DeleteByQueryRequest("efshdx"); // 替換成您的索引名稱
        MatchPhraseQueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery("catagoryId", "1640927455451201537");
        request.setQuery(matchPhraseQueryBuilder);
        BulkByScrollResponse response = client.deleteByQuery(request, RequestOptions.DEFAULT); // 替換成您的Elasticsearch客戶端實例
        long deleted = response.getStatus().getDeleted();
        System.out.println("刪除掉的es數(shù):"+deleted);
        client.close();
    }

更新,或者新建屬性

    @Test
    // 使用es的Update Mapping API來更新日期映射,或者新建屬性
    public void updateDateMapping() throws IOException {
        HttpHost host = HttpHost.create("http://192.168.16.188:9200");
        RestClientBuilder builder = RestClient.builder(host);
        client = new RestHighLevelClient(builder);
        PutMappingRequest request = new PutMappingRequest("person1"); // 替換成您的索引名稱
        XContentBuilder mappingBuilder = XContentFactory.jsonBuilder();
        mappingBuilder.startObject();
        {
            mappingBuilder.startObject("properties");
            {
                mappingBuilder.startObject("time1");
                {
                    mappingBuilder.field("type", "date");
                    mappingBuilder.field("format", "yyyy/MM/dd"); // 更新日期格式
                }
                mappingBuilder.endObject();
                mappingBuilder.startObject("time2");
                {
                    mappingBuilder.field("type", "date");
                    mappingBuilder.field("format", "yyyy/MM/dd"); // 更新日期格式
                }
                mappingBuilder.endObject();
            }
            mappingBuilder.endObject();
        }
        mappingBuilder.endObject();
        request.source(mappingBuilder);
        AcknowledgedResponse response = client.indices().putMapping(request, RequestOptions.DEFAULT); // 替換成您的Elasticsearch客戶端實例

        client.close();
    }

創(chuàng)建索引并添加屬性

@Test
    // 創(chuàng)建索引并添加屬性
    public void addIndexAndMapping() throws IOException {
        HttpHost host = HttpHost.create("http://192.168.16.188:9200");
        RestClientBuilder builder = RestClient.builder(host);
        client = new RestHighLevelClient(builder);
        CreateIndexRequest request = new CreateIndexRequest("person1"); // 替換成您的索引名稱
        XContentBuilder mappingBuilder = XContentFactory.jsonBuilder();
        mappingBuilder.startObject();
        {
            mappingBuilder.startObject("properties");
            {
                // 添加字符串類型字段
                mappingBuilder.startObject("string-field");
                {
                    mappingBuilder.field("type", "text");
                }
                mappingBuilder.endObject();

                // 添加整數(shù)類型字段
                mappingBuilder.startObject("integer-field");
                {
                    mappingBuilder.field("type", "integer");
                }
                mappingBuilder.endObject();

                // 添加日期類型字段
                mappingBuilder.startObject("date-field");
                {
                    mappingBuilder.field("type", "date");
                    mappingBuilder.field("format", "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis");
                }
                mappingBuilder.endObject();

                // 添加嵌套類型字段
                mappingBuilder.startObject("nested-field");
                {
                    mappingBuilder.field("type", "nested");
                    mappingBuilder.startObject("properties");
                    {
                        mappingBuilder.startObject("nested-string-field");
                        {
                            mappingBuilder.field("type", "text");
                        }
                        mappingBuilder.endObject();
                    }
                    mappingBuilder.endObject();
                }
                mappingBuilder.endObject();
            }
            mappingBuilder.endObject();
        }
        mappingBuilder.endObject();
        request.mapping(mappingBuilder);
        CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT); // 替換成您的Elasticsearch客戶端實例

        client.close();
    }

單屬性多條件查詢,類似in查詢

@Test
    // 單屬性多條件查詢,類似in查詢
    public void queryByMultiFieldValue() throws IOException {
        HttpHost host = HttpHost.create("http://192.168.16.188:9200");
        RestClientBuilder builder = RestClient.builder(host);
        client = new RestHighLevelClient(builder);
        SearchRequest searchRequest = new SearchRequest("person1"); // 替換成您的索引名稱
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        List<String> list = new ArrayList<>();
        list.add("我40");
        list.add("我50");
        TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("newName", list);
        searchSourceBuilder.query(termsQueryBuilder);
        searchRequest.source(searchSourceBuilder);
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); // 替換成您的Elasticsearch客戶端實例
        client.close();
    }

在SpringMVC中,可以使用ResponseEntity對象將異步操作的結果返回給前端。以下是示例代碼:

@RestController
@RequestMapping("/es")
public class EsController {
    private final RestHighLevelClient client;

    @Autowired
    public EsController(RestHighLevelClient client) {
        this.client = client;
    }

    @PostMapping("/search")
    public ResponseEntity<Map<String, Object>> search(@RequestBody SearchRequest request) {
        Map<String, Object> result = new HashMap<>();

		CountDownLatch countDownLatch = new CountDownLatch(1);
        ActionListener<SearchResponse> listener = new ActionListener<SearchResponse>() {
            @Override
            public void onResponse(SearchResponse searchResponse) {
                // 在這里處理異步響應結果
                SearchHits hits = searchResponse.getHits();
                Long total = hits.getTotalHits().value;
                List<Map<String, Object>> record = new ArrayList<>();
                for (SearchHit hit : hits) {
                    Map<String, Object> sourceAsString = hit.getSourceAsMap();
                    if (sourceAsString != null) {
                        sourceAsString.put("id", sourceAsString.get("metaId"));
                    }
                    record.add(sourceAsString);
                }
                result.put("record", record);
                result.put("total", total);
                countDownLatch.countDown();
            }

            @Override
            public void onFailure(Exception e) {
            countDownLatch.countDown();
                // 處理異步響應失敗情況
                result.put("error", e.getMessage());
            }
        };

        client.searchAsync(request, RequestOptions.DEFAULT, listener);
        countDownLatch.await();

        // 返回異步操作的結果
        return ResponseEntity.ok(result);
    }
}

在以上示例代碼中,定義了一個返回類型為ResponseEntity<Map<String, Object>>的/search POST映射方法,并使用Map<String, Object>對象來存儲異步操作的結果。然后,創(chuàng)建了一個ActionListener的匿名實現(xiàn)對象,并使用client.searchAsync()方法以異步方式執(zhí)行搜索操作。在onResponse()方法中,將搜索結果存儲到result Map中。如果異步響應失敗,則使用onFailure()方法處理異常情況,并將錯誤消息存儲到result Map中。
最后,在異步操作完成之前,使用ResponseEntity.ok(result)返回一個HTTP 200 OK響應對象,并將result Map作為響應體返回給前端。文章來源地址http://www.zghlxwxcb.cn/news/detail-406300.html

在Java中操作Elasticsearch進行異步搜索,如果需要等待搜索結果返回再繼續(xù)執(zhí)行,可以使用CompletableFuture來實現(xiàn)。具體步驟如下:

@RestController
@RequestMapping("/es")
public class EsController {
    private final RestHighLevelClient client;

    @Autowired
    public EsController(RestHighLevelClient client) {
        this.client = client;
    }

    @PostMapping("/search")
    public ResponseEntity<Map<String, Object>> search(@RequestBody SearchRequest request) {
        Map<String, Object> result = new HashMap<>();

		CompletableFuture<SearchResponse> future = new CompletableFuture<>();
        ActionListener<SearchResponse> listener = new ActionListener<SearchResponse>() {
            @Override
            public void onResponse(SearchResponse searchResponse) {
                // 在這里處理異步響應結果
                SearchHits hits = searchResponse.getHits();
                Long total = hits.getTotalHits().value;
                List<Map<String, Object>> record = new ArrayList<>();
                for (SearchHit hit : hits) {
                    Map<String, Object> sourceAsString = hit.getSourceAsMap();
                    if (sourceAsString != null) {
                        sourceAsString.put("id", sourceAsString.get("metaId"));
                    }
                    record.add(sourceAsString);
                }
                result.put("record", record);
                result.put("total", total);
                future.complete(searchResponse);
            }

            @Override
            public void onFailure(Exception e) {
            future.completeExceptionally(e);
                // 處理異步響應失敗情況
                result.put("error", e.getMessage());
            }
        };

        client.searchAsync(request, RequestOptions.DEFAULT, listener);
        SearchResponse searchResponse = future.get();

        // 返回異步操作的結果
        return ResponseEntity.ok(result);
    }
}

到了這里,關于elasticsearch(es)高級查詢api的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • ES高級查詢

    ES高級查詢

    ????????ES中提供了一種強大的檢索數(shù)據(jù)方式,這種檢索方式稱為Query DSL,這種方式的豐富查詢語法讓ES檢索變得更強大,更簡潔。 1.1查詢所有[match_all] match_all:返回索引中的全部文檔。 GET /products/_search { ? \\\"query\\\": { ? ? \\\"match_all\\\": {} ? } }? ? 1.2term基于查詢 注

    2024年01月22日
    瀏覽(17)
  • SpringBoot 整合 ES 進行各種高級查詢搜索

    SpringBoot 整合 ES 進行各種高級查詢搜索

    上一章:《ElasticSearch集群的搭建》 如果你還未安裝es的相關信息,請先移步至:《ElasticSearch安裝》進行安裝 如果您的SpringBoot項目還未整合es,請移步至:《SpringBoot整合ElasticSearch實現(xiàn)模糊查詢,批量CRUD,排序,分頁,高亮》 同時本文的操作中涉及到ElasticSearchRepository和Ela

    2023年04月15日
    瀏覽(23)
  • SpringBoot操作ES進行各種高級查詢(值得收藏)

    SpringBoot操作ES進行各種高級查詢(值得收藏)

    創(chuàng)建SpringBoot項目,導入 ES 6.2.1 的 RestClient 依賴和 ES 依賴。在項目中直接引用 es-starter 的話會報容器初始化異常錯誤,導致項目無法啟動。如果有讀者解決了這個問題,歡迎留言交流 為容器定義 RestClient 對象 在 yml 文件中配置 eshost 調用相關 API 執(zhí)行操作 創(chuàng)建操作索引的對象

    2024年02月03日
    瀏覽(20)
  • ES高級查詢語法DSL實戰(zhàn) - 第504篇

    ES高級查詢語法DSL實戰(zhàn) - 第504篇

    歷史文章( 文章 累計500+) 《國內最全的Spring?Boot系列之一》 《國內最全的Spring?Boot系列之二》 《國內最全的Spring?Boot系列之三》 《國內最全的Spring?Boot系列之四》 《國內最全的Spring?Boot系列之五》 《國內最全的Spring?Boot系列之六》 《國內最全的Spring?Boot系列之七》 E

    2024年04月27日
    瀏覽(22)
  • ElasticSearch高級查詢語法

    ElasticSearch高級查詢語法

    當數(shù)據(jù)寫入ES時,數(shù)據(jù)將會通過“分詞”被切分為不同的term,ES將term與其對應的文檔列表建立一種映射關系,這種結構就是倒排索引。如下圖所示: 為了進一步提升索引的效率,ES在term的基礎上利用term的前綴或者后綴構建了term index,用于對term本身進行索引,ES實際的索引結

    2024年01月20日
    瀏覽(18)
  • Elasticsearch的高級查詢技巧

    Elasticsearch是一個基于分布式、實時、高性能、高可擴展的搜索和分析引擎。它可以處理大量數(shù)據(jù),提供快速、準確的搜索結果。Elasticsearch的查詢技巧非常重要,可以幫助我們更有效地利用Elasticsearch的功能。 在Elasticsearch中,查詢技巧主要包括以下幾個方面: 查詢語言(Query

    2024年02月21日
    瀏覽(25)
  • ElasticSearch高級查詢

    ElasticSearch高級查詢

    本內容基本都是對請求體進行配置,也是 ElasticSearch 的語法核心所在。 查詢都是用? GET ?請求。 分詞查詢 在 Postman 中,向 ES 服務器發(fā)? GET ?請求: http://127.0.0.1:9200/test/_search 請求體 查詢“name”包含“zhangsan2”的數(shù)據(jù) 查詢所有文檔 在 Postman 中,向 ES 服務器發(fā)? GET ?請求:

    2024年02月04日
    瀏覽(21)
  • Elasticsearch的高級查詢

    Elasticsearch的高級查詢

    目錄 一、條件查詢 1、單條件 1)路由查詢 ?2)body體查詢 2、多條件查詢 1)and---must ?2)or---should 3)范圍---filter 3、全文檢索、完全匹配、高亮顯示 ?二、聚合查詢 1、分組 2、求平均值 1)路由查詢 方法:get url :http://localhost:9200/wenzhang/_search?q=name:蠟筆 介紹:q后面跟的是字

    2024年02月13日
    瀏覽(21)
  • 2、ElasticSearch高級查詢

    下面這種寫法,有沒有body體,都可以查詢所有文檔,建議寫上body體。 body體中的\\\"query\\\" 代表的是一個查詢對象,里面可以有不同的查詢屬性。 \\\"match_all\\\"表示查詢類型,match_all代表查詢所有。還有 match,term , range 等查詢類型,可以參考下面寫法。 match 匹配類型查詢,會把查詢

    2024年02月16日
    瀏覽(19)
  • 實戰(zhàn)中關于elasticsearch中的查詢方法--高級查詢

    實戰(zhàn)中關于elasticsearch中的查詢方法--高級查詢

    因為最近要從elasticsearch中獲取數(shù)據(jù)給前端展示,然后自己摸索到了一些查詢方法,記錄一下,以防忘記 只展示業(yè)務層的代碼邏輯: 搜索條件方法: 分頁和排序的方法: 這就是普通的查詢辦法。 ?例如要對整個elastcsearch中的數(shù)據(jù)進行統(tǒng)計分組和巧合的時候,上述的方法就不

    2023年04月08日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包