Azure 搜索 .NET 客户端中的空间搜索 API

Spatial Search in Azure Search .NET client API

如何使用 Azure 搜索 .NET SDK 进行空间搜索? REST API 的问题已在此处得到解答:

SO thread for REST API

如何使用 .NET 客户端执行完全相同的操作 API?

更具体地说:

如何在文档 class 上定义相应的 属性? 如何查询 属性 值位于定义的圆(圆心、半径)内的文档?

我最后一次尝试成功了(一如既往,就在发布问题后...)

引用 Nuget 包 Microsoft.Spatial

使用 GeographyPoint 作为 属性 输入 class 定义:

public class MyDocument
{
    [IsFilterable, IsSortable]
    public Microsoft.Spatial.GeographyPoint Location { get; set; }
}

像这样创建文档:

var lat = ...; //Latitude
var lng = ...; //Longitude
var myDoc = new MyDocument();

myDoc.Location = GeographyPoint.Create(lat, lng);
// Upload to index

这样查询:

// center of circle to search in
var lat = ...;
var lng = ...;
// radius of circle to search in
var radius = ...;

// Make sure to use invariant culture to avoid using invalid decimal separators
var latString = lat.ToString(CultureInfo.InvariantCulture);
var lngString = lng.ToString(CultureInfo.InvariantCulture);
var radiusString = radius.ToString(CultureInfo.InvariantCulture);

var searchParams = new SearchParameters();
searchParams.Filter = $"geo.distance(location, geography'POINT({lngString} {latString})') lt {radius}";

var searchResults = index.Documents.Search<Expert>(keyword, searchParams);
var items = searchResults.Results.ToList();

请注意,location 对应于 属性 名称 Location,如果您的 属性 名称不同,则需要相应地进行替换。要按距离排序结果,还要设置 OrderBy-属性 搜索参数:

searchParams.OrderBy = new List<string> { $"geo.distance(location, geography'POINT({lngString} {latString})') asc" };

我花了一段时间才发现,在查询中定义点时:

geography'POINT({lngString} {latString})'

参数顺序 (Longitude, Latitude) 与大多数其他约定不同(即 Google 映射 API 使用其他方式)。

虽然它会起作用,但接受的答案是不正确的。您 不需要 添加对 Microsoft.Spatial 的引用并使用 GeographicalPoint 类型。

您只需创建一个 class 即可序列化为 GeoJSON 地理类型:

{ “类型”:“点”, “坐标”:[125.6, 10.1] }

在 C# 中:

public class GeoPoint
{
    [JsonProperty("type")]
    public string Type { get; } = "Point";

    [JsonProperty("coordinates")]
    public double[] Coordinates { get; set; } = new double[0];
}

作为索引 class 中的 属性:

    [IsSearchable, IsFilterable]
    [JsonProperty(PropertyNames.Location)]
    public GeoPoint Location { get; set; }

**如果将其添加为新 属性,则需要在重新编制索引之前在 Azure 门户中添加 属性: