一尘不染

Elasticsearch-preIndex

elasticsearch

我正在执行一项维护任务,该任务将拦截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;

    }

});

我做错了什么?被删除的字段将不会被持久化:(

感谢您的提示!


阅读 321

收藏
2020-06-22

共1个答案

一尘不染

尽管这IndexingOperationListener并不是要修改文档,但是代码看起来不错。唯一的事情是您只修改了已建立索引的lucene文档,其中不包含要删除的字段。如果您不想在源代码中使用它,也必须修改源代码。但我认为,即使您在文档中看到了该字段,也无法对其进行实际搜索,因为它不是在lucene中。如果可以搜索并获得结果,则需要确保您的自定义代码确实在运行。

另外,您无需清除列表并再次添加所有文档。您只需要修改循环中的文档即可。

2020-06-22