2016-01-19 1 views
1

Я побежал ElasticSearch 1.x (счастливо) более года. Теперь пришло время для некоторой модернизации - до 2.1.x. Узлы должны быть отключены, а затем (один за другим) снова включиться. Кажется, достаточно легко.
Но потом я столкнулся с бедами. Основная проблема - это поле _uid, которое я создал сам, чтобы узнать точное местоположение документа из случайного другого (путем хэширования значения). Таким образом, я знал, что только тот будет возвращен. Во время обновления я получилElasticsearch 2.x индексное сопоставление _id

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)

Update (не помог):
обновления отображения _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]; 

Update: Изменено имя в _id вместо _uid так как последняя строить из _type # _id. Тогда мне нужно будет написать _id.

ответ

0

Поскольку, похоже, нет способа установить _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); 

Doing - единственное обновление - с помощью curl является mapping-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']" 
    } 
    } 
}