如何在 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'))
以 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'))