2015-06-22 92 views
0

讓我先解釋一下我的場景。 我正在從RDBMS中獲取數據並將其推入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 } 

但是,當我看到我在testindex testtype的映射,字段的所有映射爲「A型」的:「串」

爲什麼領域沒有映射到「類型」:「串」 ,或「類型」:「長」,甚至「類型」:「日期」作爲彈性搜索默認做?

回答

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

謝謝你們的答覆。 其實我在調用 'code' indexRequest(singleDataRow);之前輸出了singleDataRow(MAP ); 'code' like this: 'code' System.out.println(singleDataRow.get(「AGE」)。getClass()); '代碼' 它返回我: java.math.BigDecimal –

+0

您插入到您的索引中的第一個文檔可能是使用字符串而不是整數/浮動嗎?無論如何,刪除索引,創建和使用映射API來設置字段類型,然後插入文檔。 –

+0

我沒有創建任何索引。 我執行'DELETE _all'使用意義,並運行我的java代碼, ,當我GET'testindex/_mapping':所有字段都有字符串作爲它們的類型! –

相關問題