ElasticSearch - JavaRestClient に基づいてドキュメントをクエリします (一致、正確、複合クエリ、および並べ替え、ページング、強調表示)

目次

1. JavaRestClient に基づいてドキュメントをクエリする

1.1. クエリ API のデモ

1.1.1. 基本的なクエリフレームワーク

DSLリクエストの対応フォーマット

応答を解析する

1.1.2. 全文検索クエリ

1.1.3. 正確なクエリ

1.1.4. 複合クエリ

1.1.5. ソートとページング

1.1.6、ハイライト


1. JavaRestClient に基づいてドキュメントをクエリする


1.1. クエリ API のデモ

1.1.1. 基本的なクエリフレームワーク

次に、match_all を介して all をクエリして、次の基本的な API を示します。

    @Test
    public void testMatchAll() throws IOException {
        //1.准备 SearchRequest
        SearchRequest request = new SearchRequest("hotel");
        //2.准备参数
        request.source().query(QueryBuilders.matchAllQuery());
        //3.发送请求,并接收响应
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //4.解析响应
        handlerResponse(response);
    }

    /**
     * 处理响应
     * @param response
     */
    private void handlerResponse(SearchResponse response) {
        //1.解析结果
        SearchHits hits = response.getHits();
        //获取总条数
        long total = hits.getTotalHits().value;
        SearchHit[] hits1 = hits.getHits();
        for(SearchHit searchHit : hits1) {
            //获取source
            String json = searchHit.getSourceAsString();
            System.out.println(json);
        }
    }

上記から、クエリの基本的な手順は次のとおりであることがわかります。

  1. SeaechRequest オブジェクトを作成し、インデックス ライブラリを指定します。
  2. Request.source() は DSL であるパラメータを準備します。
    1. QueryBuilder を使用してクエリ条件を作成します。
    2. Request.source() の query() メソッドを渡して、完全なクエリを構築します。
  3. リクエストを送信して結果を取得します。
  4. 分析結果 (外側から内側、層ごと)。

DSLリクエストの対応フォーマット

DSL ステートメントの構築は、HighLevelRestClient のリソースを通じて実装されます。これには、クエリ、並べ替え、ページング、強調表示などのすべての機能が含まれます。

このうちクエリとはクエリのことであり、そのクエリ条件は各種クエリメソッドを含むQueryBuildersのツールクラスによって提供されます。

応答を解析する

こちらはレスポンス分析で、Kibana 上のクエリ結果を比較して API 呼び出し関係を確認できます。

1.1.2. 全文検索クエリ

全文検索のmatchクエリとmulti_matchクエリは、先ほど説明したmatch_allで呼び出されるAPIと基本的に同じですが、異なるのはクエリ条件、つまりクエリ部分です(QueryBuildersで構築する条件が異なります)。

    @Test
    public void testMatch() throws IOException {
        //1.准备 SearchRequest
        SearchRequest request = new SearchRequest("hotel");
        //2.准备参数
        request.source().query(QueryBuilders.matchQuery("brand", "如家"));
        //3.发送请求,并接收响应
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //4.解析响应
        handlerResponse(response);
    }

同じことが multi_match にも当てはまりますが、複数のパラメータ クエリをサポートできます。

    @Test
    public void testMultiMatch() throws IOException {
        //1.准备 SearchRequest
        SearchRequest request = new SearchRequest("hotel");
        //2.准备参数
        request.source().query(QueryBuilders.multiMatchQuery("如家", "brand", "name"));
        //3.发送请求,并接收响应
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //4.解析响应
        handlerResponse(response);
    }

操作結果:

1.1.3. 正確なクエリ

一般的な正確なクエリには、用語クエリと範囲クエリが含まれます。これらも QueryBuilders を使用して実装されます。

    @Test
    public void testTerm() throws IOException {
        //1.准备 SearchRequest
        SearchRequest request = new SearchRequest("hotel");
        //2.准备参数
        request.source().query(QueryBuilders.termQuery("city", "上海"));
        //3.发送请求,并接收响应
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //4.解析响应
        handlerResponse(response);
    }

範囲クエリについても同様です。

    @Test
    public void testRange() throws IOException {
        //1.准备 SearchRequest
        SearchRequest request = new SearchRequest("hotel");
        //2.准备参数
        request.source().query(QueryBuilders.rangeQuery("price").gte(100).lte(200)); //链式调用
        //3.发送请求,并接收响应
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //4.解析响应
        handlerResponse(response);
    }

1.1.4. 複合クエリ

ブール クエリは 1 つ以上のクエリ句の組み合わせです。サブクエリは次の方法で組み合わせることができます。

  • must: 一致する必要があるクエリ条件。「and」に似ています。
  • should: 「or」に似た、選択的一致のクエリ条件。
  • must_not: 一致してはなりません。「not」と同様、スコアリングに関与しません。
  • フィルター: 一致する必要があります。スコアリングには関与しません

RestAPI は、上記の条件を追加するための BoolQueryBuilder 条件構築メソッドも提供します。

    @Test
    public void testBoolQuery() throws IOException {
        //1.准备 SearchRequest
        SearchRequest request = new SearchRequest("hotel");
        //2.准备参数
        BoolQueryBuilder booleanQuery = QueryBuilders.boolQuery();
        booleanQuery.must(QueryBuilders.termQuery("city", "上海"));
        booleanQuery.filter(QueryBuilders.rangeQuery("price").lte("200"));
        request.source().query(booleanQuery); //链式调用
        //3.发送请求,并接收响应
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //4.解析响应
        handlerResponse(response);
    }

1.1.5. ソートとページング

検索結果のソートやページングは​​クエリと同レベルのパラメータであり、対応するAPIは以下の通りです。

    @Test
    public void testFromSize() throws IOException {
        //1.准备 SearchRequest
        SearchRequest request = new SearchRequest("hotel");
        //2.准备参数
        request.source().query(QueryBuilders.matchAllQuery());
        //分页 offset=20 size=10
        request.source().from(20).size(10);
        //降序排序
        request.source().sort("price", SortOrder.DESC);
        //3.发送请求,并接收响应
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //4.解析响应
        handlerResponse(response);
    }

1.1.6、ハイライト

強調表示された API には、要求構築 DSL ステートメントと結果解析の 2 つの部分が含まれています。

リクエストは次のように構成されます。

    @Test
    public void testHighLighter() throws IOException {
        //1.准备 SearchRequest
        SearchRequest request = new SearchRequest("hotel");
        //2.准备参数
        request.source().query(QueryBuilders.matchQuery("brand", "如家"));
        request.source().highlighter(new HighlightBuilder()
                .field("name")
                .requireFieldMatch(false));
        //3.发送请求,并接收响应
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //4.解析响应
        handlerResponse(response);
    }

応答は次のように解析されます。

    private void handlerResponse(SearchResponse response) throws JsonProcessingException {
        //1.解析结果
        SearchHits hits = response.getHits();
        //获取总条数
        long total = hits.getTotalHits().value;
        SearchHit[] hits1 = hits.getHits();
        for(SearchHit searchHit : hits1) {
            //获取source
            String json = searchHit.getSourceAsString();
            System.out.println(json);
            //2.处理高亮
            //获取高亮
            Map<String, HighlightField> highlightFieldMap = searchHit.getHighlightFields();
            if(!CollectionUtils.isEmpty(highlightFieldMap)) {
                //获取高亮字段的 value
                HighlightField highlightField = highlightFieldMap.get("name");
                if(highlightField != null) {
                    //取出高亮结果数组中的第一个,这里是酒店名称
                    String name = highlightField.getFragments()[0].string();
                    //对高亮字段的处理(这里打印做演示)
                    System.out.println(name);
                }
            }
        }
    }

実行後、soout を通じて「強調表示された」フィールドが表示されます (最終的にフロントエンドに送信され、フロントエンドが強調表示を処理できるようになります。バックエンドは強調表示する必要があるフィールドをマークするだけです)。

おすすめ

転載: blog.csdn.net/CYK_byte/article/details/133296107