解析 Azure 搜索查询过滤器

时间:2021-03-02 23:08:01

标签: c# .net parsing odata azure-cognitive-search

我的服务器充当用户搜索请求的代理。在 Azure 上请求数据之前,我们需要确保一切都是安全的。为此,我们将某些过滤器添加到查询过滤器中。 假设我的服务器收到此查询:

boundary

我想把它拆开,一块一块地检查它的过滤器,并在其中注入一个安全过滤器。

我做的第一件事就是得到过滤器:

search=&$top=10&$filter=customer/customerId gt 1 and customer/customerId lt 5

接下来,我想对其进行处理以进行验证和更改。 阅读 this post 后,我尝试像这样使用 var parsed = HttpUtility.ParseQueryString(query); var filter = parsed["$filter"];

ODataUriParser

这给我抛出了一个异常,说:

<块引用>

未处理的异常。 Microsoft.OData.UriParser.ODataUnrecognizedPathException: 资源不是 找到了细分市场“客户

  1. 我做错了什么?
  2. 有没有更简单的方法来实现我想要的?

1 个答案:

答案 0 :(得分:1)

您的 EDM 模型似乎不包含 entity set,因此不清楚过滤器正在过滤什么。 Azure 认知搜索为每个索引定义了一个 EDM 模型,其中包含一个实体集“docs”,其类型对应于索引定义。过滤器中的属性路径 Customer/CustomerId 将由 Azure 认知搜索解释为名为 CustomerId 的顶级 Edm.ComplexType 字段的 Customer 子字段(使用 OData 术语,文档是实体,Customer 是 Complex 属性,CustomerIdCustomer 的属性)。如果您想使用 ODataUriParserODataQueryOptionParser 从过滤器文本中获取语义 AST,您的 EDM 模型必须包含所有这些架构信息。

也就是说,您可能不需要完整的语义 AST 来验证过滤器表达式的安全性(假设您正在尝试防御诸如注入攻击之类的事情)。单独使用 OData 过滤器解析器的 lexical stage 可能更简单。然后就可以处理语法AST了。

如果你想要最大程度的控制,你总是可以滚动你自己的解析器。 OData 的完整 BNF 是 here

相关问题