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 门户中添加 属性:
如何使用 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 门户中添加 属性: