gpt4 book ai didi

Java Lucene IndexReader 无法正常工作

转载 作者:行者123 更新时间:2023-12-01 15:51:05 24 4
gpt4 key购买 nike

故事是这样的。我想在java中使用Lucene索引来模仿关系数据库的行为。我需要能够同时进行搜索(阅读)和写作。

例如,我想将项目信息保存到索引中。为简单起见,假设该项目有 2 个字段 - id 和 name。现在,在将新项目添加到索引之前,我正在搜索具有给定 id 的项目是否已存在。为此,我使用 IndexSearcher。此操作成功完成(即 IndexSearcher 返回包​​含我正在查找的项目 ID 的文档的内部文档 ID)。现在我想实际读取该项目 ID 的值,因此我现在使用 IndexReader 来获取索引的 Lucene 文档,我可以从中提取项目 id 字段。问题是 IndexReader 返回一个所有字段都为 NULL 的 Document。因此,为了重复 IndexSearcher 正常工作,IndexReader 返回虚假内容。

我认为这在某种程度上与刷新 IndexWriter 时文档字段数据没有保存在硬盘上有关。问题是,我第一次执行此索引操作时,IndexReader 运行良好。然而,重新启动我的应用程序后,就会发生上述情况。所以我认为数据第一次在 RAM 中 float ,但在硬盘驱动器上没有正确刷新(或完全刷新,因为 IndexSearcher 工作)。

如果我给你源代码,也许会有帮助,所以这里是(你可以安全地忽略 tryGetIdFromMemory 部分,我将其用作速度优化技巧):

public class ProjectMetadataIndexer {
private File indexFolder;
private Directory directory;
private IndexSearcher indexSearcher;
private IndexReader indexReader;
private IndexWriter indexWriter;
private Version luceneVersion = Version.LUCENE_31;

private Map<String, Integer> inMemoryIdHolder;
private final int memoryCapacity = 10000;

public ProjectMetadataIndexer() throws IOException {
inMemoryIdHolder = new HashMap<String, Integer>();

indexFolder = new File(ConfigurationSingleton.getInstance()
.getProjectMetaIndexFolder());

directory = FSDirectory.open(indexFolder);
IndexWriterConfig config = new IndexWriterConfig(luceneVersion,
new WhitespaceAnalyzer(luceneVersion));
indexWriter = new IndexWriter(directory, config);

indexReader = IndexReader.open(indexWriter, false);

indexSearcher = new IndexSearcher(indexReader);

}

public int getProjectId(String projectName) throws IOException {
int fromMemoryId = tryGetProjectIdFromMemory(projectName);
if (fromMemoryId >= 0) {
return fromMemoryId;
} else {
int projectId;

Term projectNameTerm = new Term("projectName", projectName);
TermQuery projectNameQuery = new TermQuery(projectNameTerm);

BooleanQuery query = new BooleanQuery();
query.add(projectNameQuery, Occur.MUST);

TopDocs docs = indexSearcher.search(query, 1);
if (docs.totalHits == 0) {
projectId = IDStore.getInstance().getProjectId();
indexMeta(projectId, projectName);
} else {
int internalId = docs.scoreDocs[0].doc;
indexWriter.close();
indexReader.close();
indexSearcher.close();

indexReader = IndexReader.open(directory);
Document document = indexReader.document(internalId);
List<Fieldable> fields = document.getFields();
System.out.println(document.get("projectId"));
projectId = Integer.valueOf(document.get("projectId"));
}

storeInMemory(projectName, projectId);

return projectId;
}
}

private int tryGetProjectIdFromMemory(String projectName) {
String key = projectName;
Integer id = inMemoryIdHolder.get(key);
if (id == null) {
return -1;
} else {
return id.intValue();
}
}

private void storeInMemory(String projectName, int projectId) {
if (inMemoryIdHolder.size() > memoryCapacity) {
inMemoryIdHolder.clear();
}
String key = projectName;
inMemoryIdHolder.put(key, projectId);
}

private void indexMeta(int projectId, String projectName)
throws CorruptIndexException, IOException {
Document document = new Document();

Field idField = new Field("projectId", String.valueOf(projectId),
Store.NO, Index.ANALYZED);
document.add(idField);

Field nameField = new Field("projectName", projectName, Store.NO,
Index.ANALYZED);
document.add(nameField);

indexWriter.addDocument(document);
}

public void close() throws CorruptIndexException, IOException {
indexReader.close();
indexWriter.close();
}

}

更准确地说,所有问题都发生在以下情况:

if (docs.totalHits == 0) {
projectId = IDStore.getInstance().getProjectId();
indexMeta(projectId, projectName);
} else {
int internalId = docs.scoreDocs[0].doc;

Document document = indexReader.document(internalId);
List<Fieldable> fields = document.getFields();
System.out.println(document.get("projectId"));
projectId = Integer.valueOf(document.get("projectId"));
}

在 else 分支上...我不知道出了什么问题。

最佳答案

你吗store各自的领域?如果不是,则字段“仅”存储在反向索引部分中,即字段值映射到文档,但文档本身不包含字段值。

保存文档的代码部分可能会有所帮助。

关于Java Lucene IndexReader 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6022806/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com