【问题标题】:Using the java api for Elasticsearch how can I map the doc id during indexing使用 Elasticsearch 的 java api 如何在索引期间映射 doc id
【发布时间】:2013-08-25 17:30:47
【问题描述】:

我正在将数据索引到 ElasticSearch 引擎服务器。我有一个名为 User 的域对象。 下面是我正在使用的相关代码。现在,elasticsearch 中的_id 属性设置为该命令的增量值,如下所示:

bulkRequest.add(client.prepareIndex("heros", "entry", i+"")

但我不希望任意增加一个 id,因为 Wonder Woman 也会有一个 SN_NO 作为她的文档的 id。如何将此域对象的唯一 ID (SN_NO) 映射到弹性搜索引擎中的_id?我想要这个的原因是,我可能不得不随着时间的推移更改她的一个属性,例如腰围尺寸。而且我不希望弹性搜索引擎包含 2 个神奇女侠,一个腰细,一个胖子作为愚蠢的例子。

抱歉这个问题太长了,我努力让它读起来很有趣。

提前谢谢你!

公共类 TestBulkElastic {

public static void main(String [] args) throws JsonGenerationException, JsonMappingException, IOException {

    // Create User object
    User user1 = new User();
    user1.setGender(Gender.FEMALE);
    Name n = new Name();
    n.setFirst("Wonder");
    n.setLast("Woman");
    user1.setName(n);
    user1.setVerified(false);
    ObjectMapper mapper = new ObjectMapper();
    mapper.writeValue(new File("user.json"), user1);

    HashMap<String,Object> fileResult =
            new ObjectMapper().readValue(new File("user.json"), HashMap.class);

    Settings settings = ImmutableSettings.settingsBuilder()
            .put("cluster.name", "MyES").build();

    Client client = new TransportClient(settings)
        .addTransportAddress(new InetSocketTransportAddress("123.123.123.123", 9350));

    BulkRequestBuilder bulkRequest = client.prepareBulk();
    int batch = 10000;
    int i = 0 ;

    while(i < 10000000){
        bulkRequest.add(client.prepareIndex("heros", "entry", i+"")
            .setSource(fileResult));

        if(i%batch == 0){
            bulkRequest.execute().actionGet();
            bulkRequest = null;
            bulkRequest = client.prepareBulk();
            }

        i++;

    }
}

}

【问题讨论】:

  • 请正确缩进你的代码,这样真的很难读...
  • 谢谢。我已经修复了缩进。只要您拥有库,此代码就应该可以正确编译:用户类是任意的,它包含一个名为 Name 的嵌套类,因此我可以尝试使用嵌套的 json。感谢您提供的任何帮助。
  • 我已经多次阅读您的问题并且很难理解它(尽管我没有使用 Java elasticsearch 插件)。 SN_NO 是什么?我在您的代码中看不到它...
  • 为什么不删除i+"" 代码而使用SN_NO+"" 代替?我错过了什么吗?
  • 我只是提供 SN_NO 作为示例。假设 SN_NO 是每个 User、Super Woman、Bat Man 等的唯一标识符。每个人都必须有一个 SN_NO(社会安全号码)。

标签: java elasticsearch elasticsearch-plugin


【解决方案1】:

您可以在类型的映射中执行此操作。 设置_id字段的路径指向要用作_id的字段

{
"YourType": {
    "dynamic": "true",
    "_id": {
        "path": "new_id"
    },
    "_timestamp": {
        "enabled": true,
        "store": true
    },
    "properties": {
        "new_id": {
            "type": "string",
            "fields": {
                "raw": {
                    "index": "not_analyzed",
                    "type": "string"
                }
            }
        }
    }
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多