Azure Search OrderBy 不区分大小写
Azure Search OrderBy case-insensitively
我目前正在使用 .Net Core 2.2,并且我一直在使用 Microsoft.Azure.Search.Model 包来使用 Azure 搜索。
问题:我无法实现不区分大小写的 OrderBy。
我进行了一些研究,但除了在搜索索引上创建其他字段(包括原始字段的所有小写字符串字段)之外,我找不到干净的解决方案。我不喜欢这个解决方案,因为我们有超过 6 个字段需要排序。这意味着,我们将有 6 个额外的字段仅用于在搜索索引中排序,这对我来说并不是真正的最佳解决方案。
public override async Task<DocumentSearchResult<ProjectSearchModel>> SearchAsync(ISearchRequest input)
{
if (input is ProjectSearchRequest request)
{
var parameters =
new SearchParameters(includeTotalResultCount: true)
{
Filter = request.Status.Equals("All") ? $"Account eq '{request.Account}'" : $"Account eq '{request.Account}' and Status eq '{request.Status}'",
OrderBy = new[] { $"Account desc" },
Top = request.Take,
Skip = request.Skip
};
var searchResult = await base.SearchAsync(parameters, request.Text);
return searchResult;
}
else
{
throw new Exception("Account code is necessary for search in projects. ProjectSearchRequest -> ISearchRequest casting error.");
}
}
响应按帐户排序,但大写在前,小写在后。
例如,z 将出现在 A 之后,这对我们的最终用户来说没有意义。我希望 z 紧跟在 Z 之后或与 Z 一起出现。
不幸的是,您建议的选项(在 OrderBy 中使用额外的大小写规范化字段)是唯一的解决方法。您将利用令牌过滤器将该字段小写 -https://docs.microsoft.com/en-us/azure/search/index-add-custom-analyzers#token-filters
请在这里投票,以便搜索团队可以优先选择它:
https://feedback.azure.com/forums/263029-azure-search/suggestions/6328658-case-insensitive-sorting-for-string-fields
请查看预览版中的 Text normalization for case-insensitive filtering, faceting and sorting 功能。
您可以更新您的索引,以便对您想要 case-insensitive order-by 操作的字段使用此“规范化器”功能。有了这个功能,您将不再需要额外的字段。
您不再需要单独的字段 TitleCaseInsensitive
。您可以将 "normalizer": "lowercase"
添加到 Account
字段,$orderBy=Account
将按照您希望的顺序排序,忽略大小写。
“小写”规范化器是 pre-defined。如果您希望应用其他过滤器,请查看 predefined and custom normalizers
"index": {
"name": "current-local-inventory",
"fields": [
{"name": "Account", "type": "Edm.String", "filterable": true, "sortable": true, "facetable": false, "searchable": true, "normalizer":"lowercase"}
]
}
我目前正在使用 .Net Core 2.2,并且我一直在使用 Microsoft.Azure.Search.Model 包来使用 Azure 搜索。
问题:我无法实现不区分大小写的 OrderBy。
我进行了一些研究,但除了在搜索索引上创建其他字段(包括原始字段的所有小写字符串字段)之外,我找不到干净的解决方案。我不喜欢这个解决方案,因为我们有超过 6 个字段需要排序。这意味着,我们将有 6 个额外的字段仅用于在搜索索引中排序,这对我来说并不是真正的最佳解决方案。
public override async Task<DocumentSearchResult<ProjectSearchModel>> SearchAsync(ISearchRequest input)
{
if (input is ProjectSearchRequest request)
{
var parameters =
new SearchParameters(includeTotalResultCount: true)
{
Filter = request.Status.Equals("All") ? $"Account eq '{request.Account}'" : $"Account eq '{request.Account}' and Status eq '{request.Status}'",
OrderBy = new[] { $"Account desc" },
Top = request.Take,
Skip = request.Skip
};
var searchResult = await base.SearchAsync(parameters, request.Text);
return searchResult;
}
else
{
throw new Exception("Account code is necessary for search in projects. ProjectSearchRequest -> ISearchRequest casting error.");
}
}
响应按帐户排序,但大写在前,小写在后。 例如,z 将出现在 A 之后,这对我们的最终用户来说没有意义。我希望 z 紧跟在 Z 之后或与 Z 一起出现。
不幸的是,您建议的选项(在 OrderBy 中使用额外的大小写规范化字段)是唯一的解决方法。您将利用令牌过滤器将该字段小写 -https://docs.microsoft.com/en-us/azure/search/index-add-custom-analyzers#token-filters
请在这里投票,以便搜索团队可以优先选择它: https://feedback.azure.com/forums/263029-azure-search/suggestions/6328658-case-insensitive-sorting-for-string-fields
请查看预览版中的 Text normalization for case-insensitive filtering, faceting and sorting 功能。
您可以更新您的索引,以便对您想要 case-insensitive order-by 操作的字段使用此“规范化器”功能。有了这个功能,您将不再需要额外的字段。
您不再需要单独的字段 TitleCaseInsensitive
。您可以将 "normalizer": "lowercase"
添加到 Account
字段,$orderBy=Account
将按照您希望的顺序排序,忽略大小写。
“小写”规范化器是 pre-defined。如果您希望应用其他过滤器,请查看 predefined and custom normalizers
"index": {
"name": "current-local-inventory",
"fields": [
{"name": "Account", "type": "Edm.String", "filterable": true, "sortable": true, "facetable": false, "searchable": true, "normalizer":"lowercase"}
]
}