没有太多背景,这是我的问题:
要使用 C# 中的 .NET SDK 创建新的 Azure 搜索索引(使用文档中提供的酒店示例),我的代码如下所示:
public class Hotel
{
[System.ComponentModel.DataAnnotations.Key]
[IsFilterable]
public string HotelId { get; set; }
[IsFilterable, IsSortable, IsFacetable]
public double? BaseRate { get; set; }
[IsSearchable]
public string Description { get; set; }
[IsSearchable]
[Analyzer(AnalyzerName.AsString.FrLucene)]
[JsonProperty("description_fr")]
public string DescriptionFr { get; set; }
[IsSearchable, IsFilterable, IsSortable]
public string HotelName { get; set; }
[IsSearchable, IsFilterable, IsSortable, IsFacetable]
public string Category { get; set; }
[IsSearchable, IsFilterable, IsFacetable]
public string[] Tags { get; set; }
[IsFilterable, IsFacetable]
public bool? ParkingIncluded { get; set; }
[IsFilterable, IsFacetable]
public bool? SmokingAllowed { get; set; }
[IsFilterable, IsSortable, IsFacetable]
public DateTimeOffset? LastRenovationDate { get; set; }
[IsFilterable, IsSortable, IsFacetable]
public int? Rating { get; set; }
[IsFilterable, IsSortable]
public GeographyPoint Location { get; set; }
}
private static void CreateHotelsIndex(ISearchServiceClient serviceClient)
{
var definition = new Index
{
Name = "hotels",
Fields = FieldBuilder.BuildForType<Hotel>()
};
serviceClient.Indexes.Create(definition);
}
这很好用。
使用 .NET SDK 进行搜索时会出现此问题。前缀搜索工作正常
var results = indexClient.Documents.Search<Hotel>("cheap*");
将返回带有以“cheap”开头的字符串的所有文档,但我需要 string.Contains() 类型的功能,或者至少需要后缀搜索。我正在尝试做类似的事情
var results = indexClient.Documents.Search<Hotel>("*heap*");
获取任意位置包含字符串“heap”的所有结果。
我知道有多种方法可以使用自定义分析器来执行此操作,但这些分析器只能通过 Azure 搜索 REST API 创建和应用,并且只能在创建索引时进行。这使得我上面提供的几乎所有内容都无法使用,因为我必须通过 Postman 在 JSON 中定义“酒店”索引、字段和分析器,而 SDK 实际上只对查询有用。这还意味着我需要在创建的每个索引中重复定义相同的自定义分析器,因为 Azure 搜索似乎不支持全局分析器定义。
所以这里的问题是:有没有一种方法可以在 C# 中定义自定义分析器,我可以在创建时引用该分析器并将其应用于我的索引?或者,真的有一种简单的方法可以仅使用 .NET SDK 获得完整的通配符支持吗?