1

ElasticSearch 1.x を (幸いなことに) 1 年以上実行しました。いよいよ 2.1.x へのアップグレードです。ノードをオフにしてから (1 つずつ) 再度オンにする必要があります。簡単そうです。
しかし、その後、私はトラブルに遭遇しました。主な問題は_uid、ランダムな他のドキュメントから (値をハッシュすることによって) ドキュメントの正確な場所を知るために自分で作成したフィールドです。このようにして、正確なものだけが返されることを知っていました。アップグレード中に私が得た

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

しかし、前者_uid_id(これで十分なはずです) にマップしようとすると、似たような結果が得られます。

paramを使用した理由_uidは、ルックアップ時間が termsQuery (など) よりもはるかに短いためです。特定の正確なドキュメントを高速 (かつ正確) に検索するために、各ドキュメントでorフィールド
を引き続き使用するにはどうすればよいですか? 一度に何千もの正確なものを呼び出す必要があることに注意してください。そのため、ID のようなクエリが必要です。また、ドキュメントのorが存在しない場合もあります (その場合、今のように「偽のような」結果が必要です)_uid_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

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();

3 番目の引数に注意してください。これはnull(または 2 つの値の引数の場合、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);

実行 - 単一の更新 - 使用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']" 
    }
  }
}
于 2016-01-25T07:51:35.927 に答える