赛尔校园公共服务平台 Logo
平台使用
阿里云
百度云
移动云
智算服务
教育生态
登录 →
赛尔校园公共服务平台 Logo
平台使用 阿里云 百度云 移动云 智算服务 教育生态
登录
  1. 首页
  2. 阿里云
  3. 表格存储
  4. 开发参考
  5. SDK参考
  6. Go SDK
  7. 多元索引
  8. 数据查询
  9. 基础查询
  10. 嵌套类型查询

嵌套类型查询

  • 基础查询
  • 发布于 2025-04-22
  • 0 次阅读
文档编辑
文档编辑

NestedQuery用于查询嵌套类型字段中子行的数据。嵌套类型不能直接查询,需要通过NestedQuery包装,NestedQuery中需要指定嵌套类型字段的路径和一个子查询,其中子查询可以是任意Query类型。

前提条件

  • 已初始化Client。具体操作,请参见初始化OTSClient。

  • 已创建数据表并写入数据。具体操作,请参见创建数据表和写入数据。

  • 已在数据表上创建多元索引。具体操作,请参见创建多元索引。

参数

参数

说明

TableName

数据表名称。

IndexName

多元索引名称。

Path

路径名,嵌套类型的列的树状路径。例如news.title表示嵌套类型的news列中的title子列。

Query

嵌套类型的列中子列上的查询,子列上的查询可以是任意Query类型。

ScoreMode

当列存在多个值时基于哪个值计算分数。

InnerHits

嵌套类型字段的子列的配置参数。包括如下配置项:

  • Sort:Nested子行返回时的排序规则。

  • Offset:当Nested列包含多个子行时,子行返回的起始位置。

  • Limit:当Nested列包含多个子行时,返回子行的数量。默认值为3。

  • Highlight:Nested子列高亮参数配置。具体参数配置说明请参见摘要与高亮。

示例

单层级嵌套类型查询示例

以下示例用于查询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{ //构造NestedQuery的子查询。
            FieldName: "col_nested.nested_1", //设置字段名,注意带有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{ //构造NestedQuery的子查询。
			FieldName: "col_nested.nested_1",       //设置字段名,注意带有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("Highlighting query failed with err: ", err)
	} else {
		fmt.Println("RequestId: " + resp.RequestId)
                // 打印高亮结果。
		printSearchHit(resp.SearchHits, " ")
	}
	fmt.Println("highlight query finished")
}


/**
 * 打印searchHit内容。
 * @param searchHits searchHits
 * @param padding Nested结构输出时,增加前缀以打印层次信息。
 */
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("")
	}
}

常见问题

  • 使用多元索引Search接口查不到数据

  • 为什么使用多元索引翻页查询时Token失效了?

相关文档

  • 多元索引查询类型包括精确查询、多词精确查询、全匹配查询、匹配查询、短语匹配查询、前缀查询、范围查询、通配符查询、多条件组合查询、地理位置查询、嵌套类型查询、向量检索和列存在性查询,您可以选择合适的查询类型进行多维度数据查询。

    如果要对结果集进行排序或者翻页,您可以使用排序和翻页功能来实现。具体操作,请参见排序和翻页。

    如果要按照某一列对结果集做折叠,使对应类型的数据在结果展示中只出现一次,您可以使用折叠(去重)功能来实现。具体操作,请参见折叠(去重)。

  • 如果要进行数据分析,例如求最值、求和、统计行数等,您可以使用Search接口的统计聚合功能或者SQL查询来实现。具体操作,请参见统计聚合和SQL查询。

  • 如果要快速导出数据,而不关心整个结果集的顺序时,您可以使用ParallelScan接口和ComputeSplits接口实现多并发导出数据。具体操作,请参见并发导出数据。

相关文章

全匹配查询 2025-04-22 14:26

MatchAllQuery可以匹配所有行,常用于查询表中数据总行数,或者随机返回几条数据。 前提条件

精确查询 2025-04-22 14:26

TermQuery采用完整精确匹配的方式查询表中的数据,类似于字符串匹配。对于Text类型字段,只要分词后有词条可以精确匹配即可。

多词精确查询 2025-04-22 14:26

类似于TermQuery,但是TermsQuery可以指定多个查询关键词,查询匹配这些词的数据。多个查询关键词中只要有一个词精确匹配,该行数据就会被返回,等价于SQL中的In。 前提条

前缀查询 2025-04-22 14:26

PrefixQuery根据前缀条件查询表中的数据。对于Text类型字段,只要分词后的词条中有词条满足前缀条件即可。

通配符查询 2025-04-22 14:26

通配符查询中,要匹配的值可以是一个带有通配符的字符串,目前支持星号(*)和半角问号(?)两种通配符。要匹配的值中可以用星号(*)代表任意字符序列,或者用问号(?)代表任意单个字符,且支持以星号(*)或半角问号(?)开头。例如查询“table*e”,可以匹配到“tablestore”。 如果查询的模式

范围查询 2025-04-22 14:26

RangeQuery根据范围条件查询表中的数据。对于Text类型字段,只要分词后的词条中有词条满足范围条件即可。

目录
Copyright © 2025 your company All Rights Reserved. Powered by 赛尔网络.
京ICP备14022346号-15
gongan beian 京公网安备11010802041014号