AzureSearch 筛选器无法按预期工作
AzureSearch filter not working expected
我将 SQL 数据迁移到 AzureSearch 文档中以尝试新的搜索体验。我无法使用 .net sdk (3.0.4)
过滤数据
public IActionResult Search(string state, string category, string search, short pageNumber = 1, short pageSize = 10)
{
SearchIndexClient indexClient = new SearchIndexClient(searchServiceName, "search", new SearchCredentials(searchServiceApiKey));
DocumentSearchResult<SearchResultDto> results = null;
if (string.IsNullOrWhiteSpace(search))
search = "*";
if (state.Equals("All", StringComparison.InvariantCultureIgnoreCase))
state = string.Empty;
SearchParameters parameters = new SearchParameters()
{
Filter = "state eq " + state,
Top = pageSize,
Skip = (pageNumber - 1) * pageSize,
SearchMode = SearchMode.All,
IncludeTotalResultCount = true
};
try
{
results = indexClient.Documents.Search<SearchResultDto>(search, parameters);
return Ok(results.Results);
}
catch (Exception ex)
{
Console.WriteLine("Error querying index: {0}\r\n", ex.Message.ToString());
throw ex;
}
}
我遇到错误 "Exception has been thrown by the target of an invocation."
参数原始值:$count=true&$filter=state%20eq%20&queryType=simple&searchMode=all&$skip=0&$top=10
当我在 AzureSearch 探索中使用参数值时出现错误
无效表达式:表达式应在 'state eq delhi eq '.\r\nParameter 名称中的位置 19:$filter
我的代码有什么问题??
您的过滤器存在一些问题。
- OData 中的字符串文字由单引号分隔。如果省略引号,该字符串看起来像一个字段名称,但在 Azure 搜索中不允许将字段与其他字段进行比较(而且您的索引中可能没有名为 delhi 的字段)。尝试状态 eq 'delhi'.
- 您尝试使用搜索浏览器的过滤器在末尾有一个额外的 eq 运算符:“state eq delhi eq”。如果你删除额外的 eq 并在 delhi 周围加上单引号,它应该可以工作。
- 修复语法错误后,过滤器可能仍无法按预期工作。过滤器区分大小写,因此如果您尝试匹配的值实际上是大写 D 的“Delhi”,您将无法匹配。如果状态字段与可能有错误大小写的原始用户输入匹配,最好使用 searchText 参数而不是 Filter。
我将 SQL 数据迁移到 AzureSearch 文档中以尝试新的搜索体验。我无法使用 .net sdk (3.0.4)
过滤数据public IActionResult Search(string state, string category, string search, short pageNumber = 1, short pageSize = 10)
{
SearchIndexClient indexClient = new SearchIndexClient(searchServiceName, "search", new SearchCredentials(searchServiceApiKey));
DocumentSearchResult<SearchResultDto> results = null;
if (string.IsNullOrWhiteSpace(search))
search = "*";
if (state.Equals("All", StringComparison.InvariantCultureIgnoreCase))
state = string.Empty;
SearchParameters parameters = new SearchParameters()
{
Filter = "state eq " + state,
Top = pageSize,
Skip = (pageNumber - 1) * pageSize,
SearchMode = SearchMode.All,
IncludeTotalResultCount = true
};
try
{
results = indexClient.Documents.Search<SearchResultDto>(search, parameters);
return Ok(results.Results);
}
catch (Exception ex)
{
Console.WriteLine("Error querying index: {0}\r\n", ex.Message.ToString());
throw ex;
}
}
我遇到错误 "Exception has been thrown by the target of an invocation."
参数原始值:$count=true&$filter=state%20eq%20&queryType=simple&searchMode=all&$skip=0&$top=10
当我在 AzureSearch 探索中使用参数值时出现错误 无效表达式:表达式应在 'state eq delhi eq '.\r\nParameter 名称中的位置 19:$filter
我的代码有什么问题??
您的过滤器存在一些问题。
- OData 中的字符串文字由单引号分隔。如果省略引号,该字符串看起来像一个字段名称,但在 Azure 搜索中不允许将字段与其他字段进行比较(而且您的索引中可能没有名为 delhi 的字段)。尝试状态 eq 'delhi'.
- 您尝试使用搜索浏览器的过滤器在末尾有一个额外的 eq 运算符:“state eq delhi eq”。如果你删除额外的 eq 并在 delhi 周围加上单引号,它应该可以工作。
- 修复语法错误后,过滤器可能仍无法按预期工作。过滤器区分大小写,因此如果您尝试匹配的值实际上是大写 D 的“Delhi”,您将无法匹配。如果状态字段与可能有错误大小写的原始用户输入匹配,最好使用 searchText 参数而不是 Filter。