使用通配符查询(WildcardQuery)可以实现模糊查询,类似于数据库中的Like语法,例如查询文本中包含某个词或短句的数据。

说明

如果要实现NOT LIKE功能,则WildcardQuery需要和BoolQuery中的mustNotQueries结合使用。更多信息,请参见 组合查询

功能概述

通配符查询通过特定的符号实现模糊匹配,能有效提升数据查找的精确度与效率。

使用WildcardQuery功能查询数据时,您可以使用带有通配符的字符串进行数据匹配。目前支持星号(*)和问号(?)两种通配符。其中星号(*)代表任意字符序列,问号(?)代表任意单个字符。查询字符串支持以星号(*)或问号(?)开头。例如查询 table*e ,可以匹配到 tablestore

目前支持用于WildcardQuery的数据类型包括Keyword和FuzzyKeyword。

  • Keyword类型:字符串基础数据类型,在中大规模数据上进行WildcardQuery等模糊查询的性能较差,且性能会随着数据规模增长而下降。

  • FuzzyKeyword类型:专门为WildcardQuery等模糊查询功能优化过的数据类型,在小、中、大规模数据上的查询性能均会更好更稳定,且性能基本不会随着数据规模增长而下降。

为了满足用户不同场景的模糊匹配需求,多元索引提供了3种不同类型的通配符查询,具体说明请参见下表。

说明

本文主要介绍基于Keyword类型和FuzzyKeyword类型的WildcardQuery,如果想了解基于Text类型实现模糊查询的方案,请参见 基于分词的通配符查询 文档。

数据类型

查询方式

优势

劣势

Keyword

WildcardQuery

兼容Elasticsearch的方式

随着索引数据增多后查询性能会变差

FuzzyKeyword

WildcardQuery

性能好且稳定,性能基本不会随着数据规模增长而下降

数据会有部分膨胀

Text

MatchPhraseQuery

支持大小写不敏感

数据会有部分膨胀

注意事项

不论是Keyword类型还是FuzzyKeyword类型,WildcardQuery中的查询词长度均不能超过32个字符。

接口

通配符查询的接口为 Search 或者 ParallelScan ,具体的Query类型为 WildcardQuery

参数

参数

描述

fieldName

列名称。

value

带有通配符的字符串,字符串长度不能超过32个字符。

query

设置查询类型为WildcardQuery。

getTotalCount

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

返回匹配的总行数会影响查询性能。

weight

查询权重,用于全文检索场景中的score排序。查询时指定列的算分权重,值越大,结果中分数的值会越大。取值范围为正浮点数。

使用此参数不会影响返回的结果数,只会影响返回的结果中的分数。

tableName

数据表名称。

indexName

多元索引名称。

columnsToGet

是否返回所有列,包含returnAll和columns设置。

returnAll默认为false,表示不返回所有列,此时可以通过columns指定返回的列;如果未通过columns指定返回的列,则只返回主键列。

当设置returnAll为true时,表示返回所有列。

使用方式

您可以使用控制台、命令行工具或者SDK进行通配符查询。进行通配符查询之前,您需要完成如下准备工作。

重要

目前基于FuzzyKeyword类型的WildcardQuery只支持使用表格存储SDK实现。

使用控制台

  1. 进入 索引管理 页签。

    1. 登录 表格存储控制台

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

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

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

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

  3. 查询数据 对话框,查询数据。

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

      说明

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

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

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

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

    4. 设置索引字段的查询类型为 通配符查询(WildcardQuery) 和输入带通配符的值。

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

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

  4. 单击 确定

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

使用命令行工具

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

重要

目前命令行工具仅支持Keyword类型的WildcardQuery,不支持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": "WildcardQuery",
            "Query": {
                "FieldName": "col_keyword",
                "Value": "hang*u"
    }

使用SDK

您可以通过 Java SDK Go SDK Python SDK Node.js SDK .NET SDK PHP SDK 使用通配符查询。此处以Java SDK为例介绍通配符查询的使用。

说明

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

以下示例用于使用通配符查询表中Col_Keyword列的值中匹配"hang*u"的数据。

/**
 * 使用通配符查询,查询表中Col_Keyword列的值中匹配"hang*u"的数据。
 * @param client
private static void wildcardQuery(SyncClient client) {
    SearchQuery searchQuery = new SearchQuery();
    WildcardQuery wildcardQuery = new WildcardQuery(); //设置查询类型为WildcardQuery。
    wildcardQuery.setFieldName("Col_Keyword");
    wildcardQuery.setValue("hang*u"); //wildcardQuery支持通配符。
    searchQuery.setQuery(wildcardQuery);
    //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());
}

计费说明

使用多元索引查询数据时会消耗读吞吐量。更多信息,请参见 多元索引计量计费

常见问题

相关文档