AzureSearch过滤器无法正常工作

时间:2018-02-03 06:31:11

标签: azure-search azure-search-.net-sdk

我将我的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;
        }
    }

我收到错误&#34;调用目标引发了异常。&#34;

参数原始值:$ count = true&amp; $ filter = state%20eq%20&amp; queryType = simple&amp; searchMode = all&amp; $ skip = 0&amp; $ top = 10

当我在AzureSearch中使用参数值时,我发现错误 表达式无效:预期位于第19位的表达式eq delhi eq&#39;。\ r \ n参数名称:$ filter

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:1)

您的过滤器存在一些问题。

  1. OData中的字符串文字由单引号分隔。如果省略引号,则字符串看起来像字段名称,但在Azure搜索中不允许将字段与其他字段进行比较(在索引中也可能没有名为delhi的字段)。试试州eq&#39; delhi&#39;。
  2. 您在搜索资源管理器中尝试使用的过滤器最后有一个额外的eq运算符:“state eq delhi eq”。如果删除额外的eq并在delhi周围加上单引号,它应该可以工作。
  3. 修复语法错误后,过滤器仍可能无法正常工作。过滤器区分大小写,因此如果您要匹配的值实际上是带有大写字母D的“德里”,则您将无法获得匹配。如果状态字段与可能具有错误大小写的原始用户输入匹配,则最好使用searchText参数而不是Filter。