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

Tablestore:ネストクエリ

最終更新日:Dec 28, 2024

ネストクエリを実行して、ネストフィールドのサブフィールド内のデータをクエリできます。ネストフィールドは直接クエリできません。ネストフィールドをクエリするには、NestedQueryオブジェクトでネストフィールドのパスとサブクエリを指定する必要があります。サブクエリは任意のタイプのクエリを使用できます。

前提条件

パラメータ

パラメータ

説明

TableName

データテーブルの名前。

IndexName

検索インデックスの名前。

Path

ネストフィールドのパス。ネストフィールドはツリー構造を使用します。たとえば、news.titleは、newsという名前のネストフィールド内のtitleサブフィールドを指定します。

Query

ネストフィールド内のサブフィールドに対するクエリ。クエリは任意のタイプを使用できます。

ScoreMode

フィールドに複数の値が含まれている場合にスコアを計算するために使用される値。

InnerHits

ネストフィールド内のサブフィールドの設定。

  • Sort:ネストフィールド内のサブフィールドの並べ替えルール。

  • Offset:ネストフィールドが複数のサブフィールドで構成されている場合に返す最初のサブフィールド。

  • Limit:ネストフィールドが複数のサブフィールドで構成されている場合に返すサブフィールドの最大数。デフォルト値:3。

  • highlight:ネストフィールド内のサブフィールドに対してハイライト機能を有効にするかどうかを指定します。詳細については、クエリ結果のハイライトを参照してください。

単一レベルのネストフィールド

次のサンプルコードは、col_nested.nested_1フィールドの値がtablestoreである行をクエリする方法の例を示しています。この例では、col_nestedという名前のネストフィールドは、nested_1とnested_2というサブフィールドで構成されています。

func NestedQuery(client *tablestore.TableStoreClient, tableName string, indexName string) {
    searchRequest := &tablestore.SearchRequest{}
    searchRequest.SetTableName(tableName)
    searchRequest.SetIndexName(indexName)
    query := &search.NestedQuery{ // クエリタイプをNestedQueryに設定します。
        Path: "col_nested", // ネストフィールドのパスを指定します。
        Query: &search.TermQuery{ // ネストクエリ用のサブクエリを構築します。
            FieldName: "col_nested.nested_1", // クエリするフィールドの名前を指定します。フィールド名には、col_nestedプレフィックスを含める必要があります。
            Term:      "tablestore",          // フィールドの値と一致させるキーワードを指定します。
        },
        ScoreMode: search.ScoreMode_Avg,
    }
    searchQuery := search.NewSearchQuery()
    searchQuery.SetQuery(query)
    searchRequest.SetSearchQuery(searchQuery)
    // すべてのフィールドが返されるように指定します。
    searchRequest.SetColumnsToGet(&tablestore.ColumnsToGet{
        ReturnAll: true,
    })
    searchResponse, err := client.Search(searchRequest)
    if err != nil {
        fmt.Printf("%#v", err)
        return
    }
    fmt.Println("IsAllSuccess: ", searchResponse.IsAllSuccess) // クエリ条件を満たすすべての行が返されたかどうかを確認します。
    fmt.Println("RowCount: ", len(searchResponse.Rows))
    for _, row := range searchResponse.Rows {
        jsonBody, err := json.Marshal(row)
        if err != nil {
            panic(err)
        }
        fmt.Println("Row: ", string(jsonBody))
    }
}

ハイライト機能が有効になっているネストフィールド

次のサンプルコードは、col_nested.nested_1フィールドの値がtablestoreである行をクエリし、クエリ結果のキーワードをハイライトする方法の例を示しています。この例では、col_nestedという名前のネストフィールドは、nested_1とnested_2というサブフィールドで構成されています。

func NestedQueryWithHighlight(client *tablestore.TableStoreClient, tableName string, indexName string) {
	searchRequest := &tablestore.SearchRequest{}
	searchRequest.SetTableName(tableName)
	searchRequest.SetIndexName(indexName)
	query := &search.NestedQuery{ // クエリタイプをNestedQueryに設定します。
		Path: "col_nested", // ネストフィールドのパスを指定します。
		Query: &search.TermQuery{ // ネストクエリ用のサブクエリを構築します。
			FieldName: "col_nested.nested_1", // クエリするフィールドの名前を指定します。フィールド名には、col_nestedプレフィックスを含める必要があります。
			Term:      "tablestore",          // 一致させる値を指定します。
		},
		ScoreMode: search.ScoreMode_Avg,
		InnerHits: &search.InnerHits{
			Offset: proto.Int32(0),
			Limit:  proto.Int32(3),
			Highlight: &search.Highlight{
				FieldHighlightParameters: map[string]*search.HighlightParameter{
					"col_nested.nested_1": {
						NumberOfFragments: proto.Int32(5),
						PreTag:            proto.String("<em>"),
						PostTag:           proto.String("</em>"),
					},
				},
			},
		},
	}
	searchQuery := search.NewSearchQuery()
	searchQuery.SetQuery(query)
	searchRequest.SetSearchQuery(searchQuery)
	// すべてのフィールドが返されるように指定します。
	searchRequest.SetColumnsToGet(&tablestore.ColumnsToGet{
		ReturnAllFromIndex: true,
	})

	if resp, err := client.Search(searchRequest); err != nil {
		fmt.Println("ハイライトクエリがエラーで失敗しました: ", err)
	} else {
		fmt.Println("RequestId: " + resp.RequestId)
                // ハイライトされた結果を表示します。
		printSearchHit(resp.SearchHits, " ")
	}
	fmt.Println("ハイライトクエリが完了しました")
}


/**
 * クエリ条件を満たすコンテンツを表示します。
 * @param searchHits searchHits
 * 出出力が@param prefixネスト構造を使用する場合は、プレフィックスを追加して階層情報を表示します。
 */
func printSearchHit(searchHits []*tablestore.SearchHit, padding string) {
	for _, searchHit := range searchHits {
		if searchHit.Score != nil {
			fmt.Printf("%sScore: %f\n", padding, *searchHit.Score)
		}

		if searchHit.NestedDocOffset != nil {
			fmt.Printf("%sOffset: %d\n", padding, *searchHit.NestedDocOffset)
		}

		if searchHit.Row != nil {
			fmt.Printf("%sRow: %v\n", padding, *searchHit.Row)
		}

		if searchHit.HighlightResultItem != nil && len(searchHit.HighlightResultItem.HighlightFields) != 0 {
			fmt.Printf("%sHighlight: \n", padding)
			for colName, highlightResult := range searchHit.HighlightResultItem.HighlightFields {
				fmt.Printf("%sColumnName: %s, Highlight_Fragments: %v\n", padding+padding, colName, highlightResult.Fragments)
			}
		}

		if searchHit.SearchInnerHits != nil && len(searchHit.SearchInnerHits) != 0 {
			fmt.Printf("%sInnerHits: \n", padding)
			for path, innerSearchHit := range searchHit.SearchInnerHits {
				fmt.Printf("%sPath: %s\n", padding+padding, path)
				fmt.Printf("%sSearchHit: \n", padding+padding)
				printSearchHit(innerSearchHit.SearchHits, padding+padding)
			}
		}

		fmt.Println("")
	}
}

FAQ

参考資料