2016-08-19 83 views
1

我在尝试索引存储在DocumentDb集合中的文档时遇到问题。Azure搜索索引器无法从DocumentDB中的文档检索GeographyPoint文件夹

索引器的数据源是使用自定义SQL定义的,以检索已更改的文档。我要索引的文档有一个名为LocationGP的属性,它是Microsoft.Spatial.GeographyPoint,映射到同名索引字段并定义为DataType.GeographyPoint

尝试创建索引是:

列“LocationGP”的类型为J Object中不符合型Edm.GeographyPoint的索引

任何想法领域兼容?

这是数据源的定义:

return new DataSource() 
       { 
        Name = "opportunities-datasource", 
        Container = new DataContainer() 
        { 
         Name = "Companies", 
         Query = @"SELECT o.id, 
              o.CompanyName, 
              o.LocationGP, 
              o.Location.CityName AS LocationCity, 
              o.Location.StateName AS LocationState, 
              o.Location.CountryName AS LocationCountry, 
              o._ts 
           FROM Companies o WHERE o.DocType = 1 AND o._ts > @HighWaterMark" 
        }, 
        Type = "documentdb", 
        Credentials = new DataSourceCredentials() 
        { 
         ConnectionString = String.Format("AccountEndpoint={0};AccountKey={1};Database=CompaniesDb", DocumentDbEndpointUri, DocumentDbPrimaryKey) 
        }, 
        DataChangeDetectionPolicy = new HighWaterMarkChangeDetectionPolicy("_ts"), 
        DataDeletionDetectionPolicy = new SoftDeleteColumnDeletionDetectionPolicy("Status", "2") 
       }; 

这是文档:

[{ 
    "id": "088e1e97-6d59-40ad-a9be-620fdc7938c7", 
    "CompanyName": "Neptune", 
    "LocationGP": { 
     "Latitude": 39.8010482788086, 
     "Longitude": -89.6436004638672, 
     "IsEmpty": false, 
     "Z": null, 
     "M": null, 
     "CoordinateSystem": { 
     "EpsgId": 4326, 
     "Id": "4326", 
     "Name": "WGS84" 
     } 
    }, 
    "Location": { 
     "CityName": "Springfield", 
     "CountryName": "US", 
     "StateName": "IL" 
    }, 
    "Status": 1, 
    "DocType": 1, 
    "Timestamp": "2016-08-19T16:08:46.0481948Z", 
    "_ts": 1471622922 
    }] 

回答

0

问题是Edm.GeographyPoint具有比Microsoft.Spatial.GeographyPoint不同的格式。

为了使它工作,我只是创建了一个名为EdmGeograpyPoint这样的类:

public class EdmGeographyPoint 
{ 
    public EdmGeographyPoint(double longitude, double latitude) 
    { 
     coordinates = new double[] { longitude, latitude }; 
     type = "Point"; 
    } 

    public string type { get; private set; } 
    public double[] coordinates { get; private set; } 
} 

然后我更换了LocationGP属性EdmLocation的类型。

也许有更好的解决方案,但文件是围绕这个话题困惑: https://azure.microsoft.com/en-us/documentation/articles/search-howto-dotnet-sdk/

+1

您引用的文档讨论了Azure Search .NET SDK。使用Microsoft.Spatial.GeographyPoint的示例是使用索引API将文档推入索引的示例。 SDK具有专门的序列化逻辑,将GeographyPoint转换为Geo-JSON(又名:Edm.GeographyPoint)。 –