使用 OData 查询语法检查是否在 Azure 认知搜索的枚举字段上设置了标志

Check if a flag is set on an enum field in Azure Cognitive Search using OData Query Syntax

我必须找到一种方法来查询(正在使用 Azure 搜索)某个字段是否设置了一组标志而不使用按位与。限制的原因是Azure认知搜索使用OData进行查询,不支持任何位操作。

假设我们有这样一个枚举:

public enum PreferredColors
{
     red = 1,
     blue = 2,
     green = 4,
     yellow = 8
}

现在假设我有一个喜欢黄色、蓝色和红色的用户。我想检查喜欢黄色和红色的用户。通常你会这样做:

PreferredColors preference = PreferredColors.red | PreferredColors.yellow
bool res = (preference & user.ColorPreferences) == preference

其中 res 是我们要查找的结果。此检查必须是查询的一部分(出于分页原因)。有没有其他方法可以避免使用按位 &?

Azure 认知搜索不支持 OData 枚举,因此您必须使用与 Edm.Int32 不同的数据类型对此场景建模。根据您想要在应用程序中建模的方式,您可以使用 Collection(Edm.Int32) 或 Collection(Edm.String)。为了清楚起见,让我们为这些示例使用字符串集合。

你不能在 Azure 认知搜索中做的另一件事是将索引的一个字段与另一个字段进行比较,因此我将假设所需的颜色首选项为应用程序代码所知,并且可以注入到您要发送到 Azure 认知搜索的查询字符串。场景是对于搜索索引中的任何给定文档,您想要检查为应用程序指定的所有首选颜色是否都出现在该文档的颜色中。

如果要搜索的颜色首选项是 'red' 和 'green':

,您将如何使用字符串集合字段表达此查询
$filter=preferences/any(p: p eq 'red') and preferences/any(p: p eq 'green')

例如,如果您的 preferences 字段包含 ["green", "yellow", "red"] 的文档,则上述查询将匹配。