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

时间:2018-02-01 15:36:46

标签: azure search geospatial azure-search spatial-query

如何使用Azure Search .NET SDK进行空间搜索?这里已经回答了REST API的问题:

SO thread for REST API

如何使用.NET客户端API完全相同?

更具体一点:

如何在Document类中定义相应的属性? 如何查询属性值位于定义的圆(中心,半径)内的文档?

2 个答案:

答案 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; }

**如果要将其添加为新属性,则需要在Azure门户中添加该属性,然后才能重新建立索引: enter image description here