Tablestore SDK for Java のまとめとハイライト機能を使用すると、一致した term を含む Text フィールドからフラグメントを返し、設定されたタグで term をマークできます。
前提条件
Tablestore SDK for Java をインストールし、クライアントを初期化します。
機能の説明
まとめとハイライト機能は、クエリに一致した term の周辺のテキストフラグメントを抽出し、一致した term を pre-tag と post-tag で囲みます。このフラグメントを使用して、クエリの一致のコンテキストを表示できます。この機能は Text フィールドのみをサポートします。
まとめとハイライト機能を使用する前に、多次元インデックスを作成する際に、フィールドの enableHighlighting を true に設定する必要があります。クエリでは、SearchQuery.highlight を使用して、フラグメントを返したいフィールドとフラグメントの設定を指定します。フィールドは、まとめとハイライト機能をサポートするクエリ条件で使用される必要があります。そうでない場合、そのフィールドに対してハイライトされたフラグメントは返されません。
次のクエリタイプは、まとめとハイライトの結果を返すことができます:TermQuery、TermsQuery、MatchQuery、MatchPhraseQuery、PrefixQuery、WildcardQuery、RangeQuery、BoolQuery、ConstScoreQuery、NestedQuery。
BoolQuery または ConstScoreQuery の場合、前述の 7 つのクエリタイプの子クエリで使用されるフィールドに対して、まとめとハイライトを設定できます。NestedQuery の場合、InnerHits.highlight を設定して、一致した子行のまとめとハイライトの結果を返します。詳細については、「ネスト化クエリ」をご参照ください。
-
MatchQueryまたはMatchPhraseQueryを使用する場合、一致した term が複数の pre-tag と post-tag のペアで囲まれることがあります。 -
Textフィールドに最大セマンティック形態素解析が使用されている場合、MatchPhraseQueryはまとめとハイライトをサポートしません。 -
フラグメントの境界が一致した term を分割することがあります。この場合、その term はハイライトされません。
次の例では、一致検索を使用して、description フィールドに tablestore という term が含まれる行を取得します。この例では、返されたフラグメント内で一致した term を <b> と </b> で囲みます。description フィールドは、まとめとハイライトが有効になっている Text フィールドです。
String tableName = "example_table";
String indexName = "example_index";
MatchQuery matchQuery = new MatchQuery();
matchQuery.setFieldName("description");
matchQuery.setText("tablestore");
HighlightParameter highlightParameter = new HighlightParameter();
highlightParameter.setPreTag("");
highlightParameter.setPostTag("");
Highlight highlight = new Highlight();
highlight.addFieldHighlightParam("description", highlightParameter);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(matchQuery);
searchQuery.setHighlight(highlight);
searchQuery.setLimit(10);
SearchRequest request = new SearchRequest(tableName, indexName, searchQuery);
SearchResponse response = client.search(request);
for (SearchHit hit : response.getSearchHits()) {
HighlightResultItem resultItem = hit.getHighlightResultItem();
if (resultItem == null) {
continue;
}
HighlightField field = resultItem.getHighlightFieldByName("description");
if (field != null) {
System.out.println(field.getFragments());
}
}
パラメーター
request.searchQuery.highlight は Highlight 型です。fieldHighlightParams の値は、個々のフィールドのフラグメントの動作を設定する HighlightParameter オブジェクトです。
次の表では、完全なパラメーターパスを使用して、Highlight と HighlightParameter の 2 つの設定レベルについて説明します。
|
名前 |
タイプ |
説明 |
|
fieldHighlightParams (必須) |
|
フィールド名とフラグメントの設定。キーは、まとめとハイライトの結果を返したいフィールドの名前です。値は、そのフィールドの |
|
highlightEncoder (オプション) |
HighlightEncoder |
ハイライトされたフラグメント内の元のテキストのエンコーディング方式。有効な値:
|
|
fieldHighlightParams[].numberOfFragments (オプション) |
Integer |
フィールドに対して返すハイライトされたフラグメントの最大数。このパラメーターを |
|
fieldHighlightParams[].fragmentSize (オプション) |
Integer |
各フラグメントのターゲットの長さ。デフォルト値は |
|
fieldHighlightParams[].preTag (オプション) |
String |
一致した term の pre-tag。デフォルト値は |
|
fieldHighlightParams[].postTag (オプション) |
String |
一致した term の post-tag。デフォルト値は |
|
fieldHighlightParams[].highlightFragmentOrder (オプション) |
HighlightFragmentOrder |
複数のハイライトされたフラグメントが返される順序。 |
応答
クエリの応答
search メソッドは SearchResponse オブジェクトを返します。次のフィールドは、まとめとハイライトに関連しています。
|
名前 |
タイプ |
説明 |
|
searchHits |
|
クエリヒット。 |
|
isAllSuccess |
boolean |
すべてのインデックスパーティションがクエリされたかどうかを示します。 |
クエリヒット
response.searchHits[] は SearchHit 型です。次のフィールドは、まとめとハイライトに関連しています。
|
名前 |
タイプ |
説明 |
|
row |
Row |
行データ。 |
|
highlightResultItem |
HighlightResultItem |
行内のすべてのフィールドのまとめとハイライトの結果。 |
ハイライト結果
response.searchHits[].highlightResultItem は HighlightResultItem 型で、次のフィールドを含みます。
|
名前 |
タイプ |
説明 |
|
highlightFields |
|
行内のフィールドのハイライト結果。 |
フィールドフラグメント
response.searchHits[].highlightResultItem.highlightFields[fieldName] は HighlightField 型で、次のフィールドを含みます。
|
名前 |
タイプ |
説明 |
|
fragments |
|
フィールドのハイライトされたフラグメント。 |