次のJavaコードを使用してエラスティック検索インデックスを作成しようとしています
public class MappingCreator {
static Logger log = Logger.getLogger(MappingCreator.class.getName());
final static String indexName = "indxyz";
final static String typeName = "indtype";
final static String mappingFileName = "customMapping.json";
final static String clusterName = "elasticsearch";
final static String hostName = "localhost";
public static void main(String args[]) throws IOException
{
MappingCreator mapCreator = new MappingCreator();
Client myESclient = getClient();
IndicesExistsResponse res = myESclient.admin().indices().prepareExists(indexName).execute().actionGet();
if (res.isExists()) {
log.warn("Index "+indexName +" already exists. Will be deleted");
final DeleteIndexRequestBuilder deleteIndexBuilder = myESclient.admin().indices().prepareDelete(indexName);
deleteIndexBuilder.execute().actionGet();
}
final CreateIndexRequestBuilder createIndexBuilder = myESclient.admin().indices().prepareCreate(indexName)
.addMapping(typeName, mapCreator.getIndexFieldMapping());
CreateIndexResponse createIndexResponse = createIndexBuilder.execute().actionGet();
log.debug("Created mapping "+createIndexResponse.toString());
myESclient.close();
}
private String getIndexFieldMapping() throws IOException {
return IOUtils.toString(getClass().getClassLoader().getResourceAsStream(mappingFileName));
}
private static Client getClient() {
TransportClient transportClient = null;
try
{
Settings settings = ImmutableSettings.settingsBuilder().put("cluster.name", clusterName).build();
transportClient = new TransportClient(settings);
transportClient = transportClient.addTransportAddress(new InetSocketTransportAddress(hostName, 9300));
}
catch (Exception e)
{
log.error("Error in MappingCreator creating Elastic Search Client\n"
+ "Message "+e.getMessage()+"\n"
+ "StackTrace "+e.getStackTrace()
);
}
return (Client) transportClient;
}
}
customMapping.json は次のようになります
{
"properties": {
"popkDate": {
"type":"date",
"format": "yyyy-MM-dd 'T' HH:mm:ss.SSZ"
},
"popk": {
"type": "string"
}
}
}
今、マッピングを作成した後、elasticsearch 驚異プラグインで次を実行すると
get indxyz/
私は得る
{
"indxyz": {
"aliases": {},
"mappings": {
"indtype": {
"properties": {
"popkDate": {
"type": "date",
"format": "yyyy-MM-dd 'T' HH:mm:ss.SSZ"
},
"popk": {
"type": "string"
}
}
}
}
これは正確です。
今、このデータを取り込もうとすると
{
"popkDate":"2001-01-01T235959.00-0400",
"popk":"cuinbcwenvubn"
}
何らかの理由で、popkDate フィールドは Date ではなく String としてインデックス付けされています。さて、もう一度見ると
get indxyz/
今回は、
{
"indxyz": {
"aliases": {},
"mappings": {
"indtype": {
"properties": {
"popkDate": {
"type": "date",
"format": "yyyy-MM-dd 'T' HH:mm:ss.SSZ"
},
"popk": {
"type": "string"
}
}
},
"indtype": {
"properties": {
"popkDate": {
"type": "string"
},
"popk": {
"type": "string"
}
}
}
}
この重複したマッピングが作成されたのはなぜですか? 同じタイプの?JAVA API を使用せずに、つまり curl コマンドを使用してマッピングを作成すると、この動作は観察されず、popkDate フィールドは期待どおりにインデックス付けされることに注意してください。これはなぜですか?
お知らせ下さい。