ネストクエリを実行して、ネストフィールドのサブフィールド内のデータをクエリできます。ネストフィールドは直接クエリできません。ネストフィールドをクエリするには、NestedQueryオブジェクトでネストフィールドのパスとサブクエリを指定する必要があります。サブクエリは任意のタイプのクエリを使用できます。
前提条件
OTSClientインスタンスが初期化されていること。詳細については、OTSClientインスタンスの初期化を参照してください。
データテーブルが作成され、データがデータテーブルに書き込まれていること。詳細については、データテーブルの作成とデータの書き込みを参照してください。
データテーブルの検索インデックスが作成されていること。詳細については、検索インデックスの作成を参照してください。
パラメータ
パラメータ | 説明 |
TableName | データテーブルの名前。 |
IndexName | 検索インデックスの名前。 |
Path | ネストフィールドのパス。ネストフィールドはツリー構造を使用します。たとえば、news.titleは、newsという名前のネストフィールド内のtitleサブフィールドを指定します。 |
Query | ネストフィールド内のサブフィールドに対するクエリ。クエリは任意のタイプを使用できます。 |
ScoreMode | フィールドに複数の値が含まれている場合にスコアを計算するために使用される値。 |
InnerHits | ネストフィールド内のサブフィールドの設定。
|
例
単一レベルのネストフィールド
次のサンプルコードは、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
参考資料
検索インデックスを使用してデータをクエリする場合、次のクエリメソッドを使用できます。タームクエリ、タームズクエリ、マッチオールクエリ、マッチクエリ、マッチフレーズクエリ、プレフィックスクエリ、範囲クエリ、ワイルドカードクエリ、ジオクエリ、ブールクエリ、KNNベクトル検索クエリ、ネストクエリ、存在クエリ。検索インデックスによって提供されるクエリメソッドを使用して、ビジネス要件に基づいて複数のディメンションからデータをクエリできます。
並べ替え機能とページング機能を使用して、クエリ条件を満たす行を並べ替えたり、ページネーションしたりできます。詳細については、並べ替えとページングを参照してください。
折りたたみ(重複排除)機能を使用して、特定の列に基づいて結果セットを折りたたむことができます。これにより、指定されたタイプのデータはクエリ結果に1回だけ表示されます。詳細については、折りたたみ(重複排除)を参照してください。
データテーブル内のデータを分析する場合は、Search操作の集計機能を使用するか、SQLステートメントを実行できます。たとえば、最小値、最大値、合計、行の総数を取得できます。詳細については、集計とSQLクエリを参照してください。
行を並べ替えることなく、クエリ条件を満たすすべての行を取得する場合は、ParallelScan操作とComputeSplits操作を呼び出して並列スキャン機能を使用できます。詳細については、並列スキャンの実行を参照してください。