2016-08-19 3 views
1

DocumentDb 컬렉션에 저장된 문서의 색인을 생성하는 동안 문제가 있습니다.Azure Search Indexer가 DocumentDB의 문서에서 GeographyPoint 파일을 가져올 수 없습니다.

인덱서의 데이터 소스는 변경된 문서를 검색하기 위해 사용자 지정 SQL을 사용하여 정의되었습니다. 색인을 생성 할 문서는 LocationGP이라는 Microsoft.Spatial.GeographyPoint라는 속성이 있으며 동일한 이름의 색인 필드에 매핑되고 DataType.GeographyPoint으로 정의됩니다.

인덱서는 다음과 같습니다 즉 인덱스

어떤 아이디어를 입력 Edm.GeographyPoint의 분야와 호환되지 않습니다하는 jobject 'LocationGP'유형 인

열?

[{ 
    "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.GeographyPointMicrosoft.Spatial.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") 
       }; 

이 문서입니다 :

는 데이터 소스의 정의입니다.
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; } 
} 

가 그럼 난 EdmLocation에 LocationGP 속성의 유형을 대체 :

작동하려면 그냥 이런 EdmGeograpyPoint라는 클래스를 만들었습니다.

은 어쩌면 더 나은 솔루션이 있지만, 사용 설명서는이 주제에 혼란 : 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 (a.k.a. Edm.GeographyPoint)으로 변환하는 특수 직렬화 논리가 있습니다. –