目次
1. JavaRestClient に基づいてドキュメントをクエリする
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);
}
}
上記から、クエリの基本的な手順は次のとおりであることがわかります。
- SeaechRequest オブジェクトを作成し、インデックス ライブラリを指定します。
- Request.source() は DSL であるパラメータを準備します。
- QueryBuilder を使用してクエリ条件を作成します。
- Request.source() の query() メソッドを渡して、完全なクエリを構築します。
- リクエストを送信して結果を取得します。
- 分析結果 (外側から内側、層ごと)。
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 を通じて「強調表示された」フィールドが表示されます (最終的にフロントエンドに送信され、フロントエンドが強調表示を処理できるようになります。バックエンドは強調表示する必要があるフィールドをマークするだけです)。