如何使用Azure Search .NET SDK进行空间搜索?这里已经回答了REST API的问题:
如何使用.NET客户端API完全相同?
更具体一点:
如何在Document类中定义相应的属性? 如何查询属性值位于定义的圆(中心,半径)内的文档?
答案 0 :(得分:3)
让我的最后一次尝试(就像往常一样,在发布问题之后......)
引用Nuget包 Microsoft.Spatial
在类定义中使用GeographyPoint
作为属性类型:
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 Maps API使用其他方式)。
答案 1 :(得分:0)
尽管可以使用,但是接受的答案不正确。您不需要,无需添加对Microsoft.Spatial的引用并使用GeographicalPoint类型。
您只需要创建一个将序列化为GeoJSON地理类型的类:
{ “ type”:“ Point”, “坐标”:[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];
}
作为索引类中的属性:
[IsSearchable, IsFilterable]
[JsonProperty(PropertyNames.Location)]
public GeoPoint Location { get; set; }