文档

常见问题

更新时间:

本文汇总了搜索索引的常见问题。

什么是搜索索引?

搜索索引是宽表引擎的一种新型索引,可以对查询进行加速。主要面向复杂的多维查询场景,能够覆盖分词、模糊查询、聚合分析、排序翻页、向量检索等场景。详细介绍,请参见搜索索引介绍

如果您想要更深入地了解搜索索引的技术细节,请参见如何破解HBase+Elasticsearch组合使用遇到的难题深度解析Lindorm全文索引(SearchIndex)特性

搜索索引的适用场景有哪些?

搜索索引主要适用于以下几种场景:

  • 查询时需要检索的列较多,且各个列的组合可能是随机的。例如在设计二级索引时,如果需要检索的列很多则通常很容易超过索引表个数(默认5个)限制,此时建议使用搜索索引。

  • 有分词查询的需求,例如需要对文章标题或内容的关键词进行检索。

  • 有向量检索的需求,例如需要对图片进行相似度检索。

  • 有Count统计需求,通过宽表引擎统计表行数的方法不能满足性能或准确性要求。统计表行数的介绍请参见如何统计表行数

  • 在使用宽表引擎的排序、统计聚合或模糊查询等功能时,无法满足性能要求。

搜索索引与二级索引的区别是什么?

  • 搜索索引是宽表引擎与搜索引擎深度融合的特性,需要单独开通购买,核心功能为倒排索引和列存,适合较为复杂的多维查询场景,一个宽表只能创建一个搜索索引表,索引列个数最多1000个(默认)。

    二级索引是Lindorm宽表内置的特性,无需开通即可使用,适合较为固定的查询场景,一个宽表默认最多有5个二级索引表。

  • 搜索索引的数据一致性默认为最终一致,数据写入宽表后需等待1-15秒后才可查询,如果希望数据能更快可查询,请提交工单咨询。

    二级索引的数据一致为强一致,数据写入宽表即可查询。

为什么已购买搜索引擎,使用搜索索引还需要单独开通?

搜索引擎是一个独立的引擎,可以不依赖宽表引擎和LTS单独使用。而搜索索引是宽表引擎的一个索引功能,开通时不仅需要购买搜索引擎,还需要购买LTS数据同步节点。所以仅仅购买搜索引擎,还无法使用搜索索引功能。LTS数据同步节点的价格,请参见LTS

说明

如果创建索引的过程中出现no bds cluster has been registeredLindorm Search cluster address is nullplease activate it in the Wide Table Engine错误信息,表示您还未开通搜索索引功能。请先开通搜索索引功能再进行创建索引操作,如何开通,请参见开通搜索索引

模糊查询和分词查询的区别及适用的场景有哪些?

  • 模糊查询:通常是指使用SQL中的LIKE通配符匹配关键词的查询。这种查询方式在搜索索引创建后可以直接使用。但是当需要匹配的数据量较大或本身存储的字符串内容较长时,查询性能可能会随着数据量的增大而降低。

  • 分词查询:数据查询时,搜索引擎会先对原始字符串进行分词,再对分词字段执行关键词匹配操作,例如在通用搜索引擎产品中进行关键词检索。这种查询方式通常无法保证每次检索都一定能匹配到数据,即使原始写入的数据中包含检索内容,但这些数据在存储时经过分词或过滤停词等操作后导致最终构建的索引字段中没有对应的检索内容,那么检索结果也仍旧为空。另外,不同分词器的分词效果也不相同。

如果在业务上使用分词查询可以满足模糊查询的需求,建议您优先选择分词查询。

中文分词建议使用IK分词器,英文分词建议使用English分词器。使用分词查询代替模糊查询时,可以使用双引号("")将关键词括起来以提高匹配度,例如where fieldName='"hello world"'

如果业务上确定是需要模糊查询,不是分词查询,可以参考以下方法处理:

  • 方法一:

    转换字段内容,使分词查询达到近似模糊查询的效果。例如,使用逗号或空格将需要检索的关键词分隔开,并在创建搜索索引时配置whitespace或comma分词。这种查询可以直接使用等值过滤并有效规避LIKE查询可能造成的性能瓶颈。

  • 方法二:

    定义字段的数据类型为String,并在SQL中使用LIKE通配符查询。

    说明

    使用LIKE通配符查询在数据量增大时可能会产生性能降低问题,建议您在使用时及时关注查询性能。

  • 方法三:

    如果上述两种方法都无法满足业务需求,您可以使用ngram分词器。在创建搜索索引时,设置analyzer=ngram

    说明
    • 使用ngram分词器查询时,查询语句需要使用search_query高级语法。详细介绍,请参见高级查询语法

    • 查询时需要使用双引号("")将关键词括起来,同时,WHERE条件中的各种组合条件都需要写在search_query语法中。例如where search_query='fieldName:"123"'

如何评估搜索索引所需要的资源?

使用搜索索引前,除了宽表引擎,您还需要购买LTS数据同步节点和搜索引擎。

LTS数据同步节点在整体资源占比中较小,您可以根据写入峰值TPS评估所需的节点数量。例如,通常情况下,2个低配的LTS节点可以满足有20个索引列且写入峰值TPS每秒不超过5万个的业务需求。索引列越多,写入峰值TPS越高,需要的LTS节点越多。

搜索引擎的资源评估与查询和写入模型是强相关的,需要根据具体的业务场景进行评估。

对于搜索引擎所需资源的评估,建议您先购买部分节点进行性能测试,再根据测试结果选择合理的规格和节点数量。数据量在20亿规模以上时,建议搜索引擎的规格选择16核64 GB。

如果您在资源评估时需要帮助,请联系Lindorm技术支持(钉钉号:s0s3eg3)。

创建搜索索引时,需要关注哪些参数?

  • 如果只是想体验搜索索引,并无严格的业务需求,请参见管理搜索索引

  • 如果有分词需求,创建搜索索引时,需要关注analyzer参数的设置。analyzer参数的详细介绍,请参见CREATE SEARCH INDEX

  • 如果您确定某个字段在查询语句中只是简单的等值过滤查询,不会涉及排序、聚合(MAX、MIN、AVG或SUM等)、GROUP BY或范围查询时,可以将该字段的columnStored参数值设置为false,以减少构建列式索引带来的资源消耗。

  • 如果单表数据量超过2亿则需要关注numShards参数。单个Shard(分片)的数据量通常控制在3千万到1亿条之间(一般在30 GB以内),实际数据量控制需要根据实际业务情况确定。分片数对查询或写入性能的影响,请参见分片数量对查询和写入性能有什么影响?

  • 如果单表数据量超过10亿,或查询RT和查询QPS无法满足要求时可以通过创建分区索引来解决相关问题。分区索引需要关注的内容,请参见分区索引的适用场景和不适用场景有哪些?创建分区索引时,需要关注哪些参数?

分区索引的适用场景和不适用场景有哪些?

分区索引的适用场景:

单表数据量较大,例如超过10亿,或查询RT和查询QPS无法满足要求时,推荐您使用分区索引。

分区索引主要由HASH分区、时间分区或HASH分区和时间分区的组合组成,您可以根据以下场景和建议合理设置分区索引:

  • 业务数据有明显的时间属性,例如查询语句携带一个时间字段作为过滤字段,建议设置时间分区属性。

  • 在业务查询场景中,多数情况下都会携带一个或两三个过滤字段。例如某个订单查询场景,每次查询都在同一个商家下检索,都会携带商家ID进行过滤。这种场景建议设置HASH分区属性。

  • 如果业务查询场景同时具有以上两种特点,建议同时设置HASH分区和时间分区的组合属性。

分区索引的不适用场景:

针对全部数据进行检索且没有固定的过滤字段或明显的时间属性的场景,不适合使用分区索引。这种场景下,如果数据量很大且存在查询性能问题,可以考虑合理设置分片数量,或在业务上进行分表操作。

如果您想要更深入的了解分区索引对查询性能的影响,请参见分区索引是如何提升查询RT和QPS的?

如果在创建分区索引时对参数的设置有疑问,请参见创建分区索引时,需要关注哪些参数?

分区索引是如何提升查询RT和QPS的?

  • 对HASH分区来说,默认是根据一个内置的主键字段进行HASH分区,每次查询都需要扫描所有分区。根据木桶效应,整体查询的时延取决于最慢的分区。另外,当数据量很大时,单机分区数也会很多,服务端的并发请求可能会出现排队现象。如果设置固定查询字段进行HASH分区,则查询时只需要扫描某一个或某几个分区。因此,当分区数量较多时,设置固定字段会带来明显的RT和QPS提升。

    说明
    • 为提升查询性能,建议设置为HASH分区的字段的值尽量丰富,同时避免同一个分区键下的数据过多(例如不要超过1亿)。

    • 如果数据量过大,建议使用多级HASH分区。详细内容,请参见多级HASH分区(高级用法)

  • 对时间分区来说,会根据设置的RANGE_TIME_PARTITION_INTERVAL参数的值按时间范围创建分区。数据查询过程中根据某个时间范围过滤数据时,则只需要查询对应时间范围的分区。如果查询场景有明显的时间属性,并且有较大比例的查询限定在一个时间范围时,会带来明显的RT和QPS提升。

创建分区索引时,需要关注哪些参数?

需要重点关注的参数有:

  • partitions

    • 如果只有HASH分区,建议将分区数量partitions设置为较大的值,例如64、128等,可以使数据分布至更多的分区。数据查询时,如果查询语句通常会携带分区字段,那么系统只需要在某一个或某几个分区中查找数据即可;如果查询语句不携带分区字段,系统将在所有分区中查找数据。

    • 如果有时间分区,可以将partitions设置为较小的值,例如节点数的2倍。达到RANGE_TIME_PARTITION_INTERVAL参数设置的时间后,服务端会自动增加分区,增加的分区数量就是设置的partitions参数的值。

  • RANGE_TIME_PARTITION_INTERVAL:决定多数查询的时间范围,建议设置为较大概率出现的、较短的时间范围。您可以根据查询习惯,合理设置参数的值。例如,大部分查询语句过滤的时间范围在一周以内,或一次查询的跨度为一个月,但是一周内的查询更多,可以将参数的值设置为7。

  • HASH分区字段时间分区字段:HASH分区字段建议选择多数查询会携带的固定字段,时间分区字段建议选择用来指定时间范围的字段。

    说明
    • 分区字段写入后强行更新可能会导致数据紊乱。因此查询时选取的时间字段不能是支持更新的时间字段。

    • 时间字段请尽量使用LONG类型,否则可能会影响查询性能。

如果有分页的需求,怎么做比较好?

目前支持的分页方式:可以单击下一页上一页,也可以直接输入页码进行快速跳转。

这种分页方式适用于数据量在几千或几万条以内的分页场景。这种场景下,可以使用LIMIT和OFFSET组合的方式进行查询。

说明
  • 使用LIMIT和OFFSET组合查询时,如果OFFSET设置得过大,可能会消耗较大的内存和CPU资源。因此,如果业务需要使用这种查询方式,请根据实际情况限制最大查询页码。

  • 服务端默认OFFSET限制为5000。

如果有导出的需求,怎么做比较好?

您可以针对以下场景使用SQL查询:

  • 需要将匹配数据全部导出:可以不设置LIMIT,OFFSET参数。

  • 需要导出N条数据:设置limit N条件。

使用SQL查询,在获取数据时通过迭代器每次仅获取一条数据,并流式返回查询结果。对于匹配数据,服务端会自动分批拉取。客户端在处理数据时,为了防止客户端内存溢出,可以在迭代器中获取到N条数据后,增加一个数据处理逻辑,再继续在迭代器中获取其他数据。

说明

在进行数据导出时,为避免客户端在短时间对服务端发起大量查询请求,建议将同一时刻发起的导出任务控制在1~3个之间。超过3个可能会产生较大的CPU消耗,从而影响整个实例的查询RT。

如何优化数据同步速度?

如果在很长一段时间内无法查询到写入宽表的数据,可能是由于服务端资源难以支撑当前的写入TPS,导致数据同步较慢。

您可以通过以下步骤,在LTS管理页面查看实时数据同步的延迟情况。

  1. 登录Lindorm管理控制台

  2. 在页面左上角,选择实例所属的地域。

  3. 实例列表页,单击目标实例ID或者目标实例所在行操作列的管理

  4. 在左侧导航栏,单击宽表引擎

  5. 单击搜索索引页签。

  6. LTS WebUI访问区域中,单击ClusterManager公网ClusterManager专有网络

  7. 在左侧导航栏,选择Lindorm Search > 实时同步

说明

实时数据同步的延迟指标可以通过云监控控制台设置,最大任务延迟的报警阈值可以设置为600,000毫秒。具体操作,请参见云产品监控

如果实时同步延迟较大(延迟大于5秒),请根据您的业务场景选择合适的优化方式:

  • 数据基本没有更新,同时数据是整行写入的(一行数据不会分批次写入):请联系Lindorm技术支持(钉钉号:s0s3eg3)修改配置。每次写入过程中,不做并发检查,修改配置后可提升3倍左右的写入性能。

  • 数据经常会在比较短的时间内更新:请联系Lindorm技术支持(钉钉号:s0s3eg3)修改配置,修改后可提升1倍以上写入性能。

  • 数据量很大导致单分片数量过多,影响写入性能,同时,业务上有明显时间属性:创建时间分区索引。分区索引的详细说明,请参见分区索引

如何评估查询性能?

常见的对查询性能影响比较大的场景:

如果您的查询场景不属于以上列举的场景,请联系Lindorm技术支持(钉钉号:s0s3eg3)。

分片数量对查询和写入性能有什么影响?

对查询的影响:

查询时,一个分片下的数据是串行扫描的,如果一个分片下的数据很多,就会影响单次查询的RT。多个分片之间是并行查询的,如果分片数很多,一次查询给服务端造成的并发就会比较高。所以分片数不能设置太多,也不能太少。设置多少比较合适,需要结合业务对查询RT和QPS的需求进行评估。

一般来说,单个分片承载的数据量在3千万到1亿之间比较合适。如果单表数据量超过10亿,或者查询RT、查询QPS无法满足要求时,一般需要关注分区索引。分区索引的详细介绍,请参见分区索引

对写入的影响:

通常情况下,在满足上述查询需求的前提下,分片数越多,写入性能越好。

说明

建议分片数量最好设置为节点数的N倍,这样可以使得一张表的分片可以均匀地分配到各个节点中去,默认是节点数的2倍。

如何通过调整数据类型来提升查询性能?

  • 对于范围查询字段:建议将数据类型设置为数值类型,尽量不要设置为VARCHAR。相比于数值类型,VARCHAR类型的范围查询性能较差,且数据量越大,性能差距越明显。

  • 对于Type、Status等枚举类型的值:建议设置为VARCHAR类型。如果只有两种类型,建议将数据类型设置为BOOLEAN。

  • 业务上是数值类型的字段,如果查询时都是等值查询,也建议设置为VARCHAR。

搜索索引数据可以通过LTS迁移吗?

不可以。Lindorm暂不支持通过LTS迁移搜索索引数据。