前缀查询

更新时间:
复制为 MD 格式

前缀查询(PrefixQuery)用于查找多元索引中字段值以指定字符串开头的数据行。

功能概述

PrefixQuery 根据指定的前缀值匹配列中的数据。查询行为取决于列的数据类型:

  • Keyword:基础字符串类型。随着数据规模增大,查询性能会持续下降,仅适合小规模数据集。

  • FuzzyKeyword:专为前缀查询等模糊查询优化的数据类型。无论数据规模大小,查询性能均保持稳定。适用于大多数前缀查询场景。

  • Text:列值在建立索引前会经过分词处理。当分词结果中至少有一个词条满足前缀条件时,该行被命中。由于分词存在不确定性,前缀查询结果不可预测,仅为兼容性支持,请谨慎使用。

如何选择数据类型

下表汇总了各数据类型在前缀查询场景下的适用性:

数据类型

前缀查询性能

是否推荐

Keyword

随数据规模下降

仅限小规模数据集

FuzzyKeyword

数据规模不影响性能

推荐,适用于大多数场景

Text

分词导致结果不可预测

不推荐

前缀匹配示例

假设某列中存储以下值:hangzhoubeijingshanghaiharbin

  • 前缀 hang:匹配 hangzhou,不匹配 beijingshanghaiharbin

  • 前缀 ha:同时匹配 hangzhouharbin

接口

前缀查询的接口为Search或者ParallelScan,具体的 Query 类型为PrefixQuery

参数

参数

说明

query

查询类型,设置为 PrefixQuery。

fieldName

目标列的名称。

prefix

前缀值,用于与列值进行匹配。

对于 Text 类型列,匹配前会先对列值分词,分词结果中至少有一个词条满足前缀条件即视为命中。

getTotalCount

是否返回匹配的总行数。默认值为 false,即不返回。

设置为 true 会增加查询延迟。

weight

查询权重,正浮点数。用于全文检索场景中调整该列对 BM25 相关性得分的贡献,值越大,该列对排名的影响越大。

此参数不影响返回的结果集,只影响结果中各行的 BM25 得分。

tableName

数据表名称。

indexName

多元索引名称。

columnsToGet

指定返回的列,通过 returnAll 和 columns 配置。

returnAll 默认为 false。未设置 columns 时,仅返回主键列;设置 columns 后,仅返回指定列。

将 returnAll 设置为 true 时,返回所有列。

使用方式

支持通过控制台、命令行工具或SDK执行前缀查询。执行前,请完成以下准备工作。

重要

基于 FuzzyKeyword 类型的 PrefixQuery 目前仅支持通过表格存储SDK实现,控制台和命令行工具仅支持 Keyword 类型。

使用控制台

  1. 进入索引管理页签。

    1. 登录表格存储控制台

    2. 在页面上方,选择资源组和地域。

    3. 概览页面,单击实例名称或在操作列单击实例管理

    4. 实例详情页签下的数据表列表页签,单击数据表名称或在操作列单击索引管理

  2. 索引管理页签,单击目标多元索引操作列的搜索

  3. 查询数据对话框中设置查询条件。

    1. 系统默认返回所有列,如需显示指定属性列,关闭获取所有列并输入需要返回的属性列,多个属性列之间用半角逗号(,)隔开。

      说明

      系统默认会返回数据表的主键列。

    2. 根据需要选择逻辑操作符为 AndOr 或者 Not

      当选择逻辑操作符为 And 时,返回满足指定条件的数据。当选择逻辑操作符为 Or 时,如果配置了单个条件,则返回满足指定条件的数据;如果配置了多个条件,则返回满足任意一个条件的数据。当选择逻辑操作符为 Not 时,返回不满足指定条件的数据。

    3. 选择索引字段,单击添加

    4. 将查询类型设置为前缀查询(PrefixQuery),并输入前缀值。

    5. 系统默认关闭排序功能,如需根据指定字段对返回结果进行排序,打开是否排序开关后,根据需要添加要进行排序的字段并配置排序方式。

    6. 系统默认关闭统计功能,如需对指定字段进行数据统计,打开是否统计开关后,根据需要添加要进行统计的字段和配置统计信息。

  4. 单击确定

    符合查询条件的数据会显示在索引管理页签中。

使用命令行工具

通过命令行工具执行search命令使用多元索引查询数据。更多信息,请参见多元索引

重要

命令行工具仅支持 Keyword 类型的 PrefixQuery,不支持 FuzzyKeyword 类型。

  1. 执行search命令,使用 search_index 多元索引查询数据并返回所有建立索引的列。

    search -n search_index --return_all_indexed
  2. 根据系统提示输入查询条件,示例如下:

    {
        "Offset": -1,
        "Limit": 10,
        "Collapse": null,
        "Sort": null,
        "GetTotalCount": true,
        "Token": null,
        "Query": {
            "Name": "PrefixQuery",
            "Query": {
                "FieldName": "col_keyword",
                "Prefix": "hangzhou"
            }
        }
    }

使用 SDK

前缀查询支持通过Java SDKGo SDKPython SDKNode.js SDK.NET SDKPHP SDK实现。以下以 Java SDK为例。

说明

实际使用时,不论是Keyword类型还是FuzzyKeyword类型,查询语句是完全相同的,只是查询列的类型不同。

以下示例用于查询表中Col_Keyword列的值中前缀为"hangzhou"的数据。

/**
 * 查询表中Col_Keyword列中前缀为"hangzhou"的数据。
 * @param client
 */
private static void prefixQuery(SyncClient client) {
    SearchQuery searchQuery = new SearchQuery();
    PrefixQuery prefixQuery = new PrefixQuery(); //设置查询类型为PrefixQuery。
    searchQuery.setGetTotalCount(true);
    prefixQuery.setFieldName("Col_Keyword");
    prefixQuery.setPrefix("hangzhou");
    searchQuery.setQuery(prefixQuery);
    //searchQuery.setGetTotalCount(true); //设置返回匹配的总行数。

    SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
    //通过设置columnsToGet参数可以指定返回的列或返回所有列,如果不设置此参数,则默认只返回主键列。
    //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
    //columnsToGet.setReturnAll(true); //设置为返回所有列。
    //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); //设置为返回指定列。
    //searchRequest.setColumnsToGet(columnsToGet);

    SearchResponse resp = client.search(searchRequest);
    //System.out.println("TotalCount: " + resp.getTotalCount()); //打印匹配到的总行数,非返回行数。
    System.out.println("Row: " + resp.getRows());
}

计费说明

使用 VCU 模式(原预留模式)时,使用多元索引查询数据会消耗 VCU 的计算资源。使用 CU 模式(原按量模式)时,使用多元索引查询数据会消耗读吞吐量。更多信息,请参见多元索引计量计费

常见问题

相关文档