全部产品
Search
文档中心

表格存储:匹配查询

更新时间:Nov 19, 2024

MatchQuery采用近似匹配的方式查询表中的数据。表格存储会先对Text类型的列值和查询关键词按照设置好的分词器做切分,然后按照切分好后的词去查询。对于使用模糊分词的Text类型的列,建议使用MatchPhraseQuery实现高性能的模糊查询。

场景

匹配查询可用于查找包含指定短语的数据,MatchQuery结合分词使用能够实现全文检索,一般应用于大数据分析、内容搜索、知识管理、社交媒体分析、日志分析、智能问答系统、合规审查等场景,例如在电商平台中快速筛选商品标题、描述或标签中包含用户输入关键字的商品列表、在日志中快速定位错误信息或异常操作。

功能概述

MatchQuery采用近似匹配的方式查询表中的数据。例如某一行数据的title列(Text类型)的值是“杭州西湖风景区”,该列使用的分词类型是单字分词,如果MatchQuery中的查询关键词是“湖风”,则可以匹配到该行数据。

使用MatchQuery功能查询数据时,您需要设置要匹配的列和查询关键词。只要查询关键词分词后的多个词在要匹配的列中存在就表示行数据满足查询条件。

查询数据时还支持配置最小匹配个数、查询权重、要返回的列、是否返回匹配的总行数、返回数据的排序方式等。

接口

匹配查询的接口为Search或者ParallelScan,具体的Query类型为MatchQuery

参数

参数

说明

fieldName

要匹配的列。

匹配查询可应用于Text类型。

text

查询关键词,即要匹配的值。

当要匹配的列为Text类型时,查询关键词会被分词成多个词,分词类型为创建多元索引时设置的分词器类型。如果创建多元索引时未设置分词器类型,则默认分词类型为单字分词。

例如当要匹配的列为Text类型时,分词类型为单字分词,则查询词为"this is",可以匹配到“...,this is tablestore”、“is this tablestore”、“tablestore is cool”、“this"、“is”等。

query

设置查询类型为matchQuery。

offset

本次查询的开始位置。

limit

本次查询需要返回的最大数量。

如果只为了获取行数,无需具体数据,可以设置limit=0,即不返回任意一行数据。

minimumShouldMatch

最小匹配个数。

只有当某一行数据的fieldName列的值中至少包括最小匹配个数的词时,才会返回该行数据。

说明

minimumShouldMatch需要与逻辑运算符OR配合使用。

operator

逻辑运算符。默认为OR,表示当分词后的多个词只要有部分匹配时,则行数据满足查询条件。

如果设置operator为AND,则只有分词后的所有词都在列值中时,才表示行数据满足查询条件。

getTotalCount

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

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

weight

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

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

tableName

数据表名称。

indexName

多元索引名称。

columnsToGet

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

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

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

注意事项

多元索引只提供最基础的 BM25 相关性,不提供自定义相关性能力。

使用方式

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

  • 使用阿里云账号或者具有表格存储操作权限的 RAM 用户进行操作。如果需要为 RAM 用户授权表格存储操作权限,请参见通过RAM Policy为RAM用户授权进行配置。

    使用 SDK 方式和命令行工具方式进行操作时,如果当前无可用 AccessKey,则需要为阿里云账号或者 RAM 用户创建 AccessKey。具体操作,请参见创建AccessKey

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

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

  • 使用 SDK 方式进行操作时,还需要完成初始化 Client。具体操作,请参见初始化OTSClient

  • 使用命令行工具方式进行操作前,还需要完成下载并启动命令行工具,然后配置接入实例信息并选择要操作的表。具体操作,请参见下载命令行工具启动并配置接入信息数据表操作

使用控制台

  1. 进入索引管理页签。

    1. 登录表格存储控制台

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

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

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

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

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

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

      说明

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

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

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

    3. 选择Text类型的索引字段,单击添加

    4. 设置索引字段的查询类型为匹配查询(MatchQuery)和输入要查询的值。

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

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

  4. 单击确定

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

使用命令行工具

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

  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": "MatchQuery",
            "Query": {
                "FieldName": "col_text",
                "Text": "this is",
                "MinimumShouldMatch": 1
            }
        }
    }

使用SDK

您可以通过Java SDKGo SDKPython SDKNode.js SDK.NET SDKPHP SDK使用匹配查询。此处以Java SDK为例介绍匹配查询的使用。

以下示例用于查询表中Col_Keyword列的值能够匹配"hangzhou"的数据。

/**
 * 查询表中Col_Keyword列的值能够匹配"hangzhou"的数据,返回匹配到的总行数和一些匹配成功的行。
 * @param client
 */
private static void matchQuery(SyncClient client) {
    SearchQuery searchQuery = new SearchQuery();
    MatchQuery matchQuery = new MatchQuery(); //设置查询类型为MatchQuery。
    matchQuery.setFieldName("Col_Keyword"); //设置要匹配的列。
    matchQuery.setText("hangzhou"); //设置要匹配的值。
    searchQuery.setQuery(matchQuery);
    searchQuery.setOffset(0); //设置offset为0。
    searchQuery.setLimit(20); //设置limit为20,表示最多返回20行数据。
    //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());
}
            

计费说明

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

常见问题

相关文档