RavenDB 空间过滤器

RavenDB Spatial Filter

帮助理解 RavenDB 查询,我使用以下模型来存储和索引空间数据。

public class GeoRecord {
 public string SearchId {get; set;}
 public string Tag {get; set;}
 public double Latitude {get; set;}
 public double Longitude {get; set;}
}


public class GeoRecord_GeoIndex : AbstractIndexCreationTask<GeoRecord>
    {
        public GeoRecord_GeoIndex()
        {
            Map = records => from @record in records
                select new
                {
                    IndexName = "geoIndex",
                    record.SearchId,
                    Coordinates = CreateSpatialField(@record.Latitude, @record.Longitude)
                };
        }
    }

我可以像下面这样使用空间查询来过滤所有 GeoRecord:

await session
    .Query<GeoRecord, GeoRecord_GeoIndex>()
    .Spatial("Coordinates", factory => factory.Within(shapeWkt: wkt))
    .ToListAsync();

但是我想通过 SearchId 和坐标进行过滤,我得到了这个解决方案,但是我想了解它是否使用 GeoRecord_GeoIndex 而不是从 GeoRecord 中过滤结果。

await session.Advanced.AsyncDocumentQuery<GeoRecord, GeoRecord_GeoIndex>()
                .WhereIn("SearchId", activeSearchIds)
                .Intersect()
                .Spatial("Coordinates", criteria => criteria.Within(shapeWkt:wkt))
                .ToListAsync();

您正在查询索引 GeoRecord_GeoIndex,它是用来过滤的索引。

一个静态索引包含:

  1. Map 函数中指定的每个索引字段的索引项列表,
    (您的索引字段是:IndexName、SearchId 和 Coordinates)
  2. 到相关文档的映射

在查询时,根据您的查询过滤索引词,并从数据库中获取相关文档

一些 link 演示:
https://demo.ravendb.net/demos/csharp/static-indexes/map-index#step-3