使用特殊字符时,Azure 搜索 SDK 部分搜索失败

Azure Search SDK fails partial search when using special characters

我有下面的代码,它应该 return Azure 索引中所有以 T&S 开头的名称 例如,结果应该如下所示

我们在代码中看到的搜索文本是 "T&S*"

的 UrlEncoded 版本

搜索代码块

   var response = await _searchClient.Documents.SearchAsync<customDto>("%22T%26S%22*",
            new SearchParameters
            {
                SearchFields = new List<string> { "Name" },
                SearchMode = SearchMode.All
            });

自定义 DTO

   public class CustomDto{
          public CustomDto(int id,string name)
          {
             Id=Convert.ToString(id),
             Name=name
          }

          [IsSearchable, IsFilterable]
          [System.ComponentModel.DataAnnotations.Key]
          public string Id { get; }

          [IsSearchable, IsFilterable, IsSortable]
          public string Name {get;}

   }

现在, 如果我将类似的搜索文本放在 azure 搜索查询中 window 我得到了预期的结果 %22T%26S%22*&searchMode=all&searchFields=Name

但由于某种原因,代码 return 的结果为空。我不明白我在这里做错了什么。

请协助。

谢谢

你可以试试下面的代码。这使用 Microsoft.Azure.Search SDK(版本 10.1.0)。

        var searchCredentials = new SearchCredentials("<api-key (admin or query>");
        var indexClient = new SearchIndexClient("<search-service-name>", "<index-name>", searchCredentials);
        var results = indexClient.Documents.Search("\"T\&S\"*",
        new SearchParameters
        {
            SearchFields = new List<string> { "Name" },
            SearchMode = SearchMode.All
        });

SDK 实际上会发出 POST 请求,因此您实际上不必 URL 对搜索字符串进行编码(发出 GET 请求时需要这样做) .您需要做的是转义 & 字符,方法是在字符前加上 \ 前缀,这就是我所做的。请在此处查看 Escaping Special Charactershttps://docs.microsoft.com/en-us/azure/search/query-lucene-syntax#bkmk_syntax 了解更多信息。