1

我运行 ElasticSearch 1.x(很高兴)一年多了。现在是升级到 2.1.x 的时候了。节点应关闭,然后(一个接一个)再次打开。似乎很容易。
但后来我遇到了麻烦。主要问题是我自己创建的字段_uid,以便我从随机另一个文档中知道文档的确切位置(通过散列值)。这样我就知道只有准确的那个会被退回。在升级期间我得到了

MapperParsingException[Field [_uid] is a metadata field and cannot be added inside a document. Use the index API request parameters.]

但是当我尝试将我的前者映射_uid_id(这也应该足够好)时,我得到了类似的东西。

我使用_uid参数的原因是因为查找时间比 termsQuery (或类似的)低很多。
我如何仍然使用每个文档中的_uidor_id字段来快速(准确)查找某些确切的文档?请注意,我必须同时调用数千个确切的,所以我需要一个类似查询的 ID。也可能会出现文档的_uidor_id不存在(在这种情况下,我想要像现在一样的“类似假”的结果)

注意:从 1.x 到 2.x 的升级非常大(过滤器消失了,名称中没有点,没有默认访问权限_xxx

更新(无用):
更新映射_uid_id使用:

final XContentBuilder mappingBuilder = XContentFactory.jsonBuilder().startObject().startObject(type).startObject("_id").field("enabled", "true").field("default", "xxxx").endObject()
            .endObject().endObject();
 CLIENT.admin().indices().prepareCreate(index).addMapping(type, mappingBuilder)
                .setSettings(Settings.settingsBuilder().put("number_of_shards", nShards).put("number_of_replicas", nReplicas)).execute().actionGet();

结果是:

MapperParsingException[Failed to parse mapping [XXXX]: _id is not configurable]; nested: MapperParsingException[_id is not configurable];

更新:将名称更改为_id,而不是,_uid因为后者是由_type#构建的_id。那么我需要能够写到_id.

4

1 回答 1

0

由于似乎没有办法设置_uid_id我将发布我的解决方案。我映射了所有具有_uidto的文档uid(用于内部引用)。在某些时候它来找我,你可以设置相关的id

要批量插入文档,id您可以:

final BulkRequestBuilder builder = client.prepareBulk();
for (final Doc doc : docs) {
    builder.add(client.prepareIndex(index, type, doc.getId()).setSource(doc.toJson()));
}
final BulkResponse bulkResponse = builder.execute().actionGet();

注意第三个参数,这个参数可能是null(或者是一个双值参数,那么idES 将生成)。然后,您可以
通过以下方式获取一些文件:id

final List<String> uids = getUidsFromSomeMethod(); // ids for documents to get
final MultiGetRequestBuilder builder = CLIENT.prepareMultiGet();
builder.add(index_name, type, uids);
final MultiGetResponse multiResponse = builder.execute().actionGet();
// in this case I simply want to know whether the doc exists
if (only_want_to_know_whether_it_exists){
    for (final MultiGetItemResponse response : multiResponse.getResponses()) {
        final boolean exists = response.getResponse().isExists();
        exist.add(exists);
    }
} else {
    // retrieve the doc as json
    final String string = builder.getSourceAsString();
    // handle JSON
}

如果你只想要1:

client.prepareGet().setIndex(index).setType(type).setId(id);

做 - 单一更新 - 使用curl的是映射ID字段(注意:精确副本):

# Example documents
PUT my_index/my_type/1
{
  "text": "Document with ID 1"
}

PUT my_index/my_type/2
{
  "text": "Document with ID 2"
}

GET my_index/_search
{
  "query": {
    "terms": {
      "_id": [ "1", "2" ] 
    }
  },
  "script_fields": {
    "UID": {
      "script": "doc['_id']" 
    }
  }
}
于 2016-01-25T07:51:35.927 回答