如何在 Azure 认知搜索中查询具有多个值的字段

How to query fields with multiple values in Azure Cognitive Search

以 MS SQL table 身份使用后端进行 Azure 认知搜索,在某些情况下需要帮助来定义查询。

样本table结构和数据:

场景 1: 需要定义一个查询,该查询将 return 基于类别的数据。 我使用 search.ismatch 绑定了查询,但它使用前缀搜索并匹配其他类别以及类似类型的值,即“嵌入式”和“嵌入式视觉”

$filter=Region eq 'AA' and search.ismatch('Embedded*','Category')

https://{AZ_RESOURCE_NAME}.search.windows.net/indexes/{INDEX_NAME}/docs?api-version=2020-06-30-Preview&$count=true&$filter=Region eq  'AA' and search.ismatch('Embedded*','Category')

它会返回以下结果,其中包括“嵌入式”和“嵌入式视觉”这两个类别。

但我的期望是仅当数据匹配“嵌入式”类别时才获取数据,如下突出显示

场景 2: 对于上述场景 1,需要很少的增强来查找具有多个类别的记录

例如,如果我传递多个类别(即“嵌入式”、“自动化”)需要下面突出显示的输出

您需要使用不同的分析器来破坏每个“;”上的标记仅用于类别字段而不是 'whitespaces'.

您应该首先确保您的类别数据在索引中填充为集合 (Edm.String)。参见官方文档中的Supported Data Types。每个以分号分隔的值都应该是集合中的单独值,在名为 Category(或类似)的 属性 中。

然后您可以按集合中的字符串值进行过滤。参见 rules for filtering string collections。假设您的索引包含一个名为 Category 的字符串集合字段,您可以按包含 Embedded 的类别进行过滤,如下所示:

Category/any(c: c eq 'Embedded')

您可以像这样按多个值进行过滤:

Category/any(c: search.in(c, 'Embedded, Automation'))

从索引中的干净数据开始,对您拥有的数据使用适当的类型。这允许您实现适当的方面,并且您可以使用专门为此制作的语法。尝试使用通配符解决此问题是一种应该避免的黑客行为。

为了解决上述问题,使用了下面的 SQL 函数,它将类别转换为 Azure 搜索中 Collection(Edm.String) 数据类型支持的 json 字符串数组。

Sql函数

CREATE FUNCTION dbo.GetCategoryAsArray
(
    @ID VARCHAR(20)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    
    DECLARE @result NVARCHAR(MAX) = ''

    SET @result = REPLACE( 
        STUFF(
            (SELECT 
                ','''+ TRIM(Value) + ''''
             FROM dbo.TABLEA p
                CROSS APPLY STRING_SPLIT (Category, ';')
             WHERE p.ID = @ID
                FOR XML PATH('')
            ),1,1,''),'&','&')
    RETURN '[' + @result + ']'
END
GO

查看要使用的功能和return需要的数据

CREATE View dbo.TABLEA_VIEW AS
select 
       id
      ,dbo. GetCategoryAsArray(id) as CategoryArr
      ,type
      ,region
      ,Category
from dbo.TABLEA

使用上面的 SQL View 作为数据源定义了新的 Azure 搜索索引,并在索引列映射期间将 CategoryArr 列定义为 Collection(Edm.String) 数据类型

用于实现 Azure 搜索的预期输出的查询

$filter=Region eq  'AA' and CategoryArr/any(c: search.in(c, 'Embedded, Automation'))