2014-09-04 1 views
2

Я использую клиентскую библиотеку NEST для Elasticearch для создания индекса для определенного типа.Создать индекс с отображением свойств геошапы

Тип содержит три свойства string плюс один для хранения типа geo_shape (для использования с формой envelope).

Дело в том, сгенерированный запросе не удается разобрать в ES:

{ 
    "error": "MapperParsingException[mapping [layer]]; nested: MapperParsingException[No handler for type [point] declared on field [boundingBox]]; ", 
    "status": 400 
} 

Запрос устроится от NEST, который произвел это сообщение об ошибке:

POST /metadata 
{ 
    "settings": { 
    "index": { 
     "number_of_shards": 1, 
     "number_of_replicas": 0 
    } 
    }, 
    "mappings": { 
    "layer": { 
     "_all": { 
     "enabled": false 
     }, 
     "properties": { 
     "namespace": { 
      "type": "string" 
     }, 
     "name": { 
      "type": "string" 
     }, 
     "abstract": { 
      "type": "string" 
     }, 
     "boundingBox": { 
      "type": "point", 
      "tree": "geohash", 
      "tree_levels": 2, 
      "distance_error_pct": 0.025 
     } 
     } 
    } 
    } 
} 

Я обнаружил, что единственный ведение этого запроса от успеха - это объявление type для имущества boundingBox, которое должно иметь значение geo_shape, а не point.

Здесь код # C используется для выполнения вызова:

ElasticClient client = new ElasticClient(settings); 

IIndicesOperationResponse response = client.CreateIndex(c => c 
    .Index("metadata") 
    .NumberOfShards(1) 
    .NumberOfReplicas(0) 
    .AddMapping<ESLayer>(m => m 
     .Type("layer") 
     .AllField(a => a.Enabled(false)) 
     .Properties(p => p 
     .String(x => x.Name(n => n.Namespace)) 
     .String(x => x.Name(n => n.Name)) 
     .String(x => x.Name(n => n.Abstract)) 
     .GeoShape(x => x 
      .Name(n => n.BoundingBox) 
      .Tree(GeoTree.Geohash) 
      .TreeLevels(2) 
      .DistanceErrorPercentage(0.025))))); 

И ESLayer класс:

private class ESLayer 
{ 
    public string Namespace { get; set; } 

    public string Name { get; set; } 

    public string Abstract { get; set; } 

    public EnvelopeGeoShape BoundingBox { get; set; } 
} 

Обратите внимание, что я использую EnvelopeGeoShape класс, который поставляется с NEST для представления ограничивающего .

Elasticsearch версия: 1.3.1

версия НЕСТ: 1.0.2

Любой ключ на то, что я мог бы быть не хватает?

ответ

2

Это была ошибка наверняка; Хорошо поймал. Я только что открыл вопрос #925 для этого и нажал исправление. Он будет включен в следующий выпуск (1.1.0), который мы планируем выпустить очень скоро. В то же время вы можете захватить пакет NuGet из наших сборников CI здесь: https://www.myget.org/gallery/elasticsearch-net.

+0

Спасибо @Greg, хорошо это слышать! Я перейду к следующей версии, как только она будет выпущена. Тем временем, я хотел бы протестировать ночную сборку, но, похоже, сейчас у меня на ногах. Любой другой источник для пакета? – Chopin

+0

У меня, кажется, все нормально работает. Единственный другой вариант - клонировать репозиторий GitHub и компилировать решение. –

+0

Я попытался скомпилировать источник, и он сработал. Также попытался получить доступ к моему сегодня, и теперь он работает для меня. Ура! – Chopin

0

В ES нет типа точек. Вы должны использовать «geo_point» или «geo_shape» в зависимости от вашего требования.

см: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-geo-point-type.html

также: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-core-types.html

редактирования: варианты картографирования вы используете предназначены для типа geo_shape

+0

Спасибо, я понял это. Но я не пишу запрос в ES вручную, а через библиотеку NEST. Мой вопрос больше о коде .NET, используемом для создания индекса, если он чего-то не хватает, или, возможно, я столкнулся с ошибкой NEST. – Chopin

Смежные вопросы