すべてのプロダクト
Search
ドキュメントセンター

Tablestore:クエリ結果の強調表示

最終更新日:Dec 28, 2024

クエリリクエストを開始する際に、強調表示機能を有効にすることができます。この場合、クエリ条件を満たす結果内のキーワードが強調表示されます。Textフィールドのみが強調表示機能をサポートしています。

前提条件

使用上の注意

  • 一致クエリまたは一致フレーズクエリで強調表示機能を有効にした場合、クエリ結果内のクエリ文字列は、複数の開始タグ(preTag)と終了タグ(postTag)を使用して強調表示される場合があります。

  • Textフィールドのトークン化方式が最大意味単位ベースのトークン化(MaxWord)の場合、Textフィールドに対して一致フレーズクエリを実行するときに強調表示機能はサポートされません。

  • 複数のフラグメントを返す場合、フラグメント内のクエリ文字列が分割される場合があります。この場合、クエリ文字列は強調表示されない場合があります。

パラメーター

パラメーター

説明

highlightEncoder

強調表示されたテキストフラグメントのエンコード方式。有効な値:

  • PLAIN(デフォルト):エンコードを必要とせずに強調表示されたテキストフラグメントを表示します。

  • HTML:強調表示されたテキストフラグメントに対してHTMLエンコードを実行します。HTMLエンコードが完了すると、<&lt;に、>&gt;に、"&quot;に、'&#x27;に、/&#x2F;に変換されます。Webページを表示する場合は、HTML形式を使用することをお勧めします。

fieldHighlightParams

フィールドの強調表示設定。SearchQueryオブジェクトで指定されたキーワードを含むフィールドに対してのみ、強調表示機能を有効にすることができます。

HighlightParameter

numberOfFragments

返す強調表示されたテキストフラグメントの最大数。値を1に設定することをお勧めします。

fragmentSize

返す各テキストフラグメントの長さ。デフォルト値:100。

重要

返されるテキストフラグメントの実際の長さは、このパラメーターの値と異なる場合があります。

preTag

クエリキーワードを強調表示するために使用される開始タグ。例:<em>および<b>。デフォルト値:<em>。ビジネス要件に基づいてカスタムの開始タグを指定できます。preTagパラメーターは、次の文字セットをサポートしています:< > " ' /a-zA-Z、および0-9

postTag

クエリキーワードを強調表示するために使用される終了タグ。例:</em>および</b>。デフォルト値:<em>。ビジネス要件に基づいてカスタムの終了タグを指定できます。postTagパラメーターは、次の文字セットをサポートしています:< > " ' /a-zA-Z、および0-9

highlightFragmentOrder

返す強調表示されたテキストフラグメントの並べ替えルール。

  • TEXT_SEQUENCE(デフォルト):強調表示されたテキストフラグメントは、元のテキストでの出現順に並べ替えられます。

  • SCORE:強調表示されたテキストフラグメントは、ヒットキーワードのスコアに基づいて並べ替えられます。

次のサンプルコードは、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();
    }
}

関連情報

  • 強調表示機能の詳細については、キーワードの強調表示を参照してください。

  • ネストフィールドをクエリする際に強調表示機能を使用する方法については、ネストクエリを参照してください。