Lucene Index:缺少文件

亚历山大·穆勒(Alexander Muller)

我们有一个非常基本的Lucene设置。最近,我们注意到某些文档没有写入索引。

这是我们创建文档的方式:

private void addToDirectory(SpecialDomainObject specialDomainObject) throws IOException     {
    Document document = new Document();
    document.add(new TextField("id", String.valueOf(specialDomainObject.getId()), Field.Store.YES));
    document.add(new TextField("name", specialDomainObject.getName(), Field.Store.YES));
    document.add(new TextField("tags", joinTags(specialDomainObject.getTags()), Field.Store.YES));
    document.add(new TextField("contents", getContents(specialDomainObject), Field.Store.YES));

    for (Language language : getAllAssociatedLanguages(specialDomainObject)) {
        document.add(new IntField("languageId", language.getId(), Field.Store.YES));
    }
    specialDomainObjectIndexWriter.updateDocument(new Term("id", document.getField("id").stringValue()), document);
    specialDomainObjectIndexWriter.commit();
}

这是我们创建分析器和索引编写器的方式:

<bean id="luceneVersion" class="org.apache.lucene.util.Version" factory-method="valueOf">
    <constructor-arg value="LUCENE_46"/>
</bean>

<bean id="analyzer" class="org.apache.lucene.analysis.standard.StandardAnalyzer">
    <constructor-arg ref="luceneVersion"/>
</bean>

<bean id="specialDomainObjectIndexWriter" class="org.apache.lucene.index.IndexWriter">
    <constructor-arg ref="specialDomainObjectDirectory" />
    <constructor-arg>
        <bean class="org.apache.lucene.index.IndexWriterConfig">
            <constructor-arg ref="luceneVersion"/>
            <constructor-arg ref="analyzer" />
            <property name="openMode" value="CREATE_OR_APPEND"/>
        </bean>
    </constructor-arg>
</bean>

索引是通过预定任务完成的:

@Component
public class ScheduledSpecialDomainObjectIndexCreationTask implements ScheduledIndexCreationTask {

    private static final Logger logger = LoggerFactory.getLogger(ScheduledSpecialDomainObjectIndexCreationTask.class);

    @Autowired
    private IndexOperator specialDomainObjectIndexOperator;

    @Scheduled(fixedDelay = 3600 * 1000)
    @Override
    public void createIndex() {
        Date indexCreationStartDate = new Date();
        try {
            logger.info("Updating complete special domain object index...");
            specialDomainObjectIndexOperator.createIndex();
            if (logger.isDebugEnabled()) {
                Date indexCreationEndDate = new Date();
                logger.debug("Index creation duration: {} ms", indexCreationEndDate.getTime() - indexCreationStartDate.getTime());
            }
        } catch (IOException e) {
            logger.error("Could update complete special domain object index.", e);
        }
    }
}

createIndex()的实现如下:

@Override
public void createIndex() throws IOException {
    logger.trace("Preparing for index generation...");
    IndexWriter indexWriter = getIndexWriter();

    Date start = new Date();

    logger.trace("Deleting all documents from index...");
    indexWriter.deleteAll();

    logger.trace("Starting index generation...");
    long numberOfProcessedObjects = fillIndex();

    logger.debug("Index written in " + (new Date().getTime() - start.getTime()) + " milliseconds.");
    logger.debug("Number of processed objects: {}", numberOfProcessedObjects);
    logger.debug("Number of documents in index: {}", indexWriter.numDocs());

    indexWriter.commit();
    indexWriter.forceMerge(1);
}

@Override
protected long fillIndex() throws IOException {
    Page<SpecialDomainObject> specialDomainObjectsPage = specialDomainObjectRepository.findAll(new PageRequest(0, MAXIMUM_PAGE_ELEMENTS));
    while (true) {
        addToDirectory(specialDomainObjectsPage);
        if (specialDomainObjectsPage.hasNextPage()) {
            specialDomainObjectsPage =
                specialDomainObjectRepository.findAll(new PageRequest(specialDomainObjectsPage.getNumber() + 1, specialDomainObjectsPage.getSize()));
        } else {
            break;
        }
    }
    return specialDomainObjectsPage.getTotalElements();
}

大约有2000个specialDomainObject实例,而大约80个没有写入索引(我们通过Luke进行了检查)。

有什么可能导致文件丢失的吗?

亚历山大·穆勒(Alexander Muller)

我们发现了问题:操作系统的默认编码未设置为UTF-8。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Lucene Index:缺少文件

来自分类Dev

Cassandra Lucene Index布尔语法

来自分类Dev

当文档被添加/更新/删除时,Lucene Index文件中的更改?

来自分类Dev

整合Lucene Index和Amazon AWS

来自分类Dev

Lucene.Net-返回所有文件

来自分类Dev

生成Lucene segment_N文件

来自分类Dev

如何在Windows中打开Lucene文件?

来自分类Dev

导出Lucene结果/输出文件

来自分类Dev

未创建带有Lucene搜索索引文件的休眠状态:IndexWriterConfig.setWriteLockTimeout(J)Lorg / apache / lucene / index / IndexWriterConfig;

来自分类Dev

lucene删除引用已删除文件系统文件的文档

来自分类Dev

Lucene:文件存在,而无法通过使用QueryParser获取文件

来自分类Dev

Sitecore Lucene Index队列在Prod服务器中落后

来自分类Dev

如何使用Stratio Cassandra Lucene Index进行小写前缀过滤

来自分类Dev

使用 apache lucene 索引中的 Field.index

来自分类Dev

为Lucene条款计算文件数量的最快方法

来自分类Dev

CQ5.6.1 lucene配置文件在哪里?

来自分类Dev

如何检查lucene文件夹中包含的数据?

来自分类Dev

如何为Lucene jar文件设置类路径

来自分类Dev

如何在单独的Lucene索引文件之间进行联接

来自分类Dev

在Lucene.Net.Store.SimpleFSDirectory @中找不到段*文件

来自分类Dev

Magento Lucene搜索例外-segments.gen文件格式错误

来自分类Dev

通过lucene搜索获取文件夹nodeRef

来自分类Dev

带有标识符的 Lucene 索引 HTML 文件

来自分类Dev

Elasticsearch或Lucene

来自分类Dev

安装Lucene

来自分类Dev

lucene索引

来自分类Dev

Lucene的PorterStemmer

来自分类Dev

lucene索引

来自分类Dev

Lucene MemoryIndex:添加Lucene字段