クエリリクエストを開始する際に、強調表示機能を有効にすることができます。この場合、クエリ条件を満たす結果内のキーワードが強調表示されます。Textフィールドのみが強調表示機能をサポートしています。
前提条件
OTSClientインスタンスが初期化されていること。詳細については、OTSClientインスタンスの初期化を参照してください。
データテーブルが作成され、データがデータテーブルに書き込まれていること。詳細については、データテーブルの作成およびデータの書き込みを参照してください。
データテーブルの検索インデックスが作成されていること。詳細については、検索インデックスの作成を参照してください。
使用上の注意
一致クエリまたは一致フレーズクエリで強調表示機能を有効にした場合、クエリ結果内のクエリ文字列は、複数の開始タグ(preTag)と終了タグ(postTag)を使用して強調表示される場合があります。
Textフィールドのトークン化方式が最大意味単位ベースのトークン化(MaxWord)の場合、Textフィールドに対して一致フレーズクエリを実行するときに強調表示機能はサポートされません。
複数のフラグメントを返す場合、フラグメント内のクエリ文字列が分割される場合があります。この場合、クエリ文字列は強調表示されない場合があります。
パラメーター
パラメーター | 説明 | |
highlightEncoder | 強調表示されたテキストフラグメントのエンコード方式。有効な値:
| |
fieldHighlightParams | フィールドの強調表示設定。SearchQueryオブジェクトで指定されたキーワードを含むフィールドに対してのみ、強調表示機能を有効にすることができます。 | |
HighlightParameter | numberOfFragments | 返す強調表示されたテキストフラグメントの最大数。値を1に設定することをお勧めします。 |
fragmentSize | 返す各テキストフラグメントの長さ。デフォルト値:100。 重要 返されるテキストフラグメントの実際の長さは、このパラメーターの値と異なる場合があります。 | |
preTag | クエリキーワードを強調表示するために使用される開始タグ。例: | |
postTag | クエリキーワードを強調表示するために使用される終了タグ。例: | |
highlightFragmentOrder | 返す強調表示されたテキストフラグメントの並べ替えルール。
|
例
次のサンプルコードは、MatchQuery機能を使用して、Col_Textフィールドからhangzhou shanghai
に一致するデータをクエリし、クエリ結果内のキーワードを強調表示する方法の例を示しています。この例では、Col_TextフィールドはText型です。
/**
* MatchQueryオブジェクト内のキーワードの強調表示機能を有効にします。
*/
public static void matchQueryWithHighlighting(SyncClient client) {
SearchRequest searchRequest = SearchRequest.newBuilder()
.tableName("<TABLE_NAME>")
.indexName("<SEARCH_INDEX_NAME>")
.returnAllColumnsFromIndex(true)
.searchQuery(SearchQuery.newBuilder()
.limit(5)
.query(QueryBuilders.bool()
.should(QueryBuilders.match("Col_Text", "hangzhou shanghai")))
.highlight(Highlight.newBuilder()
.addFieldHighlightParam("Col_Text", HighlightParameter.newBuilder()
.highlightFragmentOrder(HighlightFragmentOrder.TEXT_SEQUENCE)
.preTag("<b>")
.postTag("</b>")
.build())
.build())
.build())
.build();
SearchResponse resp = client.search(searchRequest);
// 強調表示されたクエリ結果を表示します。非ネストフィールドをクエリする場合は、prefixパラメーターをnullに設定します。
printSearchHit(resp.getSearchHits(), "");
}
/**
* クエリ条件を満たすコンテンツを表示します。
* @param searchHits searchHits
* 出力が@param prefixネスト構造を使用する場合は、階層情報を表示するためにプレフィックスを追加します。
*/
private static void printSearchHit(List<SearchHit> searchHits, String prefix) {
for (SearchHit searchHit : searchHits) {
if (searchHit.getScore() != null) {
System.out.printf("%s Score: %s\n", prefix, searchHit.getScore());
}
if (searchHit.getOffset() != null) {
System.out.printf("%s Offset: %s\n", prefix, searchHit.getOffset());
}
if (searchHit.getRow() != null) {
System.out.printf("%s Row: %s\n", prefix, searchHit.getRow().toString());
}
// 各フィールドの強調表示されたフラグメントを表示します。
if (searchHit.getHighlightResultItem() != null) {
System.out.printf("%s Highlight: \n", prefix);
StringBuilder strBuilder = new StringBuilder();
for (Map.Entry<String, HighlightField> entry : searchHit.getHighlightResultItem().getHighlightFields().entrySet()) {
strBuilder.append(entry.getKey()).append(":").append("[");
strBuilder.append(StringUtils.join(",", entry.getValue().getFragments())).append("]\n");
}
System.out.printf("%s %s", prefix, strBuilder);
}
System.out.println();
}
}
関連情報
強調表示機能の詳細については、キーワードの強調表示を参照してください。
ネストフィールドをクエリする際に強調表示機能を使用する方法については、ネストクエリを参照してください。