You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Azure Search .NET SDK实现空间搜索?

嗨,我来帮你搞定Azure Search .NET客户端实现空间圆形搜索的问题,分两步走就轻松搞定了:

步骤1:定义带空间属性的Document类

首先,你的实体类需要包含一个GeoPoint类型的属性,这个类型来自Azure.Search.Documents.Models命名空间,它对应Azure Search索引中的Edm.GeographyPoint字段类型。

示例代码如下:

using Azure.Search.Documents.Models;

public class LocationDocument
{
    // 文档主键,必须设置
    public string Id { get; set; }

    // 空间位置属性,对应索引中的地理点字段
    public GeoPoint Location { get; set; }

    // 其他业务属性,按需添加
    public string PlaceName { get; set; }
    public string Category { get; set; }
}

额外:用SDK创建包含空间字段的索引

如果是通过.NET SDK创建索引,记得把Location字段的类型设为SearchFieldDataType.GeographyPoint:

var indexDefinition = new SearchIndex("your-locations-index")
{
    Fields =
    {
        new SimpleField("Id", SearchFieldDataType.String) { IsKey = true, IsFilterable = true },
        new SearchableField("PlaceName", SearchFieldDataType.String),
        new SearchableField("Category", SearchFieldDataType.String),
        // 定义空间字段
        new SimpleField("Location", SearchFieldDataType.GeographyPoint) { IsFilterable = true, IsSortable = true }
    }
};

// 通过SearchClient创建索引
await yourSearchClient.CreateIndexAsync(indexDefinition);
步骤2:构建圆形范围的空间查询

要筛选出位于指定圆形(中心坐标+半径)内的文档,我们需要在SearchOptions的Filter中使用Azure Search的geo.distance函数。注意:Azure Search的距离单位默认是米,如果你的半径是公里,记得转换成米。

示例代码:

// 定义圆形搜索的参数:圆心坐标(纬度、经度)和半径(5公里=5000米)
var centerLatitude = 47.6062; // 西雅图纬度
var centerLongitude = -122.3321; // 西雅图经度
double radiusInMeters = 5000;

// 构建搜索选项,设置空间过滤条件
var searchOptions = new SearchOptions
{
    // 过滤条件:geo.distance(空间字段名, 圆心点) <= 半径
    Filter = $"geo.distance(Location, geography'POINT({centerLongitude} {centerLatitude})') le {radiusInMeters}",
    // 可选:指定返回的字段,减少数据传输
    Select = { "Id", "PlaceName", "Location" },
    // 可选:按距离从近到远排序
    OrderBy = { $"geo.distance(Location, geography'POINT({centerLongitude} {centerLatitude})') asc" }
};

// 执行搜索(这里用*表示匹配所有文档,只应用过滤条件)
Response<SearchResults<LocationDocument>> searchResponse = await yourSearchClient.SearchAsync<LocationDocument>("*", searchOptions);

// 遍历查询结果
await foreach (SearchResult<LocationDocument> result in searchResponse.Value.GetResultsAsync())
{
    Console.WriteLine($"地点名称: {result.Document.PlaceName}, 坐标: ({result.Document.Location.Latitude}, {result.Document.Location.Longitude})");
}

关键说明

  • geo.distance函数计算的是空间字段值到圆心的直线球面距离
  • 过滤条件中的le是Less Than or Equal的缩写,对应<=运算符
  • 如果需要按距离排序,直接把geo.distance表达式加到OrderBy集合里即可
额外注意事项
  • 确保你的Azure Search索引中,空间字段的类型确实是Edm.GeographyPoint,否则空间过滤会失效
  • 如果需要更复杂的空间查询(比如多边形),可以用geo.intersects函数,用法类似
  • 批量导入文档时,GeoPoint类型会自动序列化为Azure Search支持的地理点格式,无需手动转换

内容的提问来源于stack exchange,提问作者Marc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:07:56