2015-06-22 2 views
0

Позвольте мне сначала объяснить мой сценарий. Я извлекаю данные из РСУБД и вставляю их в ElasticSearch. Извлечена Результаты представлены в виде списка, и я готовлю запрос насыпной указательный так:Поля ElasticSearch Сопоставление по строкам по умолчанию при индексировании

BulkRequestBuilder bulkRequest = client.prepareBulk(); 
for (Map<String,Object> singleDataRow : ResultSet) 
{ 
     IndexRequest indexRequest = new IndexRequest("testindex","testtype",singleDataRow.getObject("NAME")); 
     bulkRequest.add(indexRequest); 
} 

bulkRequest.execute().actionGet(); 

Моя карта = включает карту строки в строку, строку в большой десятичной, строку большого целого и т.д. например.

{ BIRTHDATE : 2015-03-05 , NAME : deepankar , AGE : 22 , AMOUNT : 15.5 } 

Но когда я вижу отображение моего TestType в testindex, все отображения полей имеют «типа»: «строка»

Почему полей не карты для «типа»: «строка» , или «type»: «long» и даже «type»: «date» как elasticsearch делает это по умолчанию?

ответ

2

Elasticsearch попытается «угадать» тип поля первой вставкой, если вы заранее не создали и не нанесли карты.

Есть две возможные причины, почему ваши поля индексируются, как string вместо long или любого другого типа:

  1. Вы на самом деле не посылать эти поля как int, поэтому вы отправляете '10' вместо из 10

  2. вы уже вставлены по крайней мере 1 документ, который имел значение string для этого поля, так что если вы вставили свой первый документ с AGE: '22' Elasticsearch будут установлены это поле до type: string, и любые будущие вставки будут иметь значение string.

Если вы хотите, чтобы убедиться, вы можете удалить текущий индекс, повторно создать и вручную настроить отображение перед установкой первого документа, например, так:

curl -XPUT 'http://localhost:9200/testindex/_mapping/testmapping' -d ' 
{ 
    "testmapping" : { 
     "properties" : { 
      "birthdate" : { "type" : "date", "format": "dateOptionalTime" }, 
      "name" : { "type" : "string" }, 
      "age" : { "type" : "long" }, 
      "amount" : { "type" : "double" } 
     } 
    } 
} 
' 
+0

большое спасибо за ответ. На самом деле я сделал вывод singleDataRow (MAP ) перед вызовом 'code' indexRequest (singleDataRow); 'code' вот так: ' code' System.out.println (singleDataRow.get ("AGE"). getClass()); 'code' Его возвращение: java.math.BigDecimal –

+0

Возможно ли, что первый документ, который вы вставили в свой индекс, использовал строки, а не целые числа/поплавки? В любом случае удалите индекс, создайте и используйте API сопоставления для установки типов полей, а затем вставьте свои документы. –

+0

У меня нет никакого указателя. Я выполнил 'DELETE _all', используя смысл, и запустил свой код java, и когда я' GET testindex/_mapping': все поля имеют строку как свой тип! –

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