【发布时间】:2019-07-29 05:59:58
【问题描述】:
高基数字段由具有大量唯一值的分面或可过滤字段组成,因此在计算结果时会消耗大量资源
但目前尚不清楚这种较差的性能是否仅限于在过滤器/构面查询中专门使用字段时,还是在使用搜索词查询字段时是否也会影响性能。
有更深入的 Azure 搜索知识的人可以参与进来吗?
【问题讨论】:
标签: azure azure-cognitive-search
高基数字段由具有大量唯一值的分面或可过滤字段组成,因此在计算结果时会消耗大量资源
但目前尚不清楚这种较差的性能是否仅限于在过滤器/构面查询中专门使用字段时,还是在使用搜索词查询字段时是否也会影响性能。
有更深入的 Azure 搜索知识的人可以参与进来吗?
【问题讨论】:
标签: azure azure-cognitive-search
在得到微软的澄清后,我可以确认答案是“不,只有在构面/过滤器中使用该字段时,性能才会受到影响”。
这种较差的性能仅限于在过滤器/构面查询中专门使用字段时。可搜索的词不会受到影响。
在faceted navigation 中效果最好的字段基数较低:少数不同的值在您的搜索语料库的整个文档中重复出现(例如,颜色列表、国家/地区或品牌名称)。 如果该字段具有大量唯一值,则在计算方面导航时将消耗大量资源。因为每个不同的值都是 1 个方面,需要计算。
在查询时,filter parser 接受条件作为输入,将表达式转换为表示为树的原子布尔表达式,然后在索引中的可过滤字段上评估过滤树。 如果字段具有大量唯一值,则树将很深并消耗大量计算资源。因为每个唯一值都会在过滤器中计算,所以不会有重复项的缓存结果以减少计算量。
如果字段具有大量唯一值,则不会影响可搜索字段。因为可搜索字段有inverted index 来加速查询。 加载索引时,每个字段的倒排索引都会填充每个文档中所有唯一的、标记化的单词,并映射到相应的文档 ID。例如,在索引酒店数据集时,为城市字段创建的倒排索引可能包含西雅图、波特兰等地的术语。在“城市”字段中包含西雅图或波特兰的文档将在术语旁边列出其文档 ID。
【讨论】:
我也联系了 MS,这是我得到的答案:
“高基数”对可过滤字段和可搜索字段表示不同的含义。可过滤字段的基数相当于字段完整值的唯一性。对于可搜索字段,它是关于将文档写入索引所产生的索引词的总数。例如,复杂的自定义分析器可以通过为字符串中的每个单词生成多个标记来使索引膨胀。倒排索引的扩展性非常好,所以我不会太担心索引中有大量的唯一词。但是,这应该有助于理解每个比例的单位。
文档中提到的这一点主要是为了提高人们对查询性能的贡献以及为什么他们在向过滤器子句中添加额外字段时可能会看到性能下降的认识。我将补充...您可以通过扩展服务中的分区数量来提高单个查询的性能。从 1 到 2 不仅使您的服务可用的存储空间翻了一番,而且还使可用于执行查询的计算能力翻了一番。数据工作负载在每个分区之间大致平均分配。它通常不等于查询性能的两倍,但如果您看到缓慢的查询,它可能会产生重大影响。
【讨论】: