2

私は、ES インデックス操作を傍受し、特定の状況下でフィールドの内容を変更する、前述のメンテナンス タスクに取り組んでいます。

私の質問は次のとおりです。ドキュメントを操作するにはどうすればよいですか? index.docs() メソッドがあります。たとえば、最初の (そして唯一の) ドキュメントをフェッチし、フィールドを追加して、それを保持したいのですが、残念ながら、フィールドは設定/削除されません。

例:

indexingService.addListener(new IndexingOperationListener() {

    @Override
    public Index preIndex(Engine.Index index) {

        List<Document> docs = index.docs();

        List<Document> finalDocs = new ArrayList<Document>();

        for (Document d : docs) {

            d.removeField("field1");

            finalDocs.add(d);
        }

        index.docs().clear();

        index.docs().addAll(finalDocs);

        return index;

    }

});

私が間違っていることはありますか?削除されたフィールドは永続化されません:(

ヒントをありがとう!

4

1 に答える 1

2

ドキュメントを変更するためのものではありませんでしたIndexingOperationListenerが、コードは適切に見えます。唯一のことは、削除するフィールドを含まない、索引付けされる lucene ドキュメントのみを変更していることです。ソースに含めたくない場合は、ソースも変更する必要があります。しかし、ドキュメントにフィールドが表示されていても、lucene ではないため、実際には検索できないと思います。それを検索して結果を取得できる場合は、カスタム コードが実際に実行されることを確認する必要があります。

また、リストをクリアしてすべてのドキュメントを再度追加する必要はありません。ループ内のドキュメントを変更するだけです。それだけです。

于 2013-09-16T10:48:32.013 に答える