elasticsearch - Elasticsearch 2.x索引映射_id

标签 elasticsearch upgrade elasticsearch-java-api

我(愉快地)运行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(或类似查询)低很多。
我如何仍可以在每个文档中使用_uid_id字段来快速(精确)查找某些确切的文档?请注意,我必须一次调用数千个确切的名称,因此我需要一个ID(如查询)。也可能会出现该文档的_uid_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

最佳答案

由于似乎无法设置_uid_id,因此我将发布解决方案。我将所有具有_uid的文档映射到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(或者是两个值的参数,然后id将由ES生成)。
要通过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);

做-单个更新-使用curlmapping-id-field(注意:精确副本):
# 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']" 
    }
  }
}

关于elasticsearch - Elasticsearch 2.x索引映射_id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34875908/

相关文章:

elasticsearch - 在 Elastic Search 中使用 query_string 旁边的过滤器

redis - 升级redis 2.4.14到redis 2.6.14,命令 "service redis start"总是挂起

spring - Elasticsearch和Spring兼容性(2019年3月)

java - Elasticsearch Java High Level Rest Client 使用多个匹配值和 OR 条件构建 boolean 查询

java - 如何将 Java 应用程序连接到 Elasticsearch?

c# - 如何格式化包含 html 的 Elasticsearch 高亮数据?

elasticsearch - 函数评分查询elasticsearch解析错误

elasticsearch - 从Elasticsearch的基本术语聚合中删除停用词?

TFS 2018 升级错误问题=icon_traffic_cone

java - Lucene IndexReader 升级