我将Lucene索引从使用字符串文档ID切换到字节数组。我遇到的问题是系统不再按其ID查找文档。我怀疑这是因为lucene代码没有执行Array.equals(),而是标准equals()。这是添加文档的代码:
Document doc = new Document();
byte[] key = indexData.getKey().toByteArray();
System.out.println(Arrays.toString(key));
doc.add(new StoredField(DOCUMENT_PRIMARY_KEY, new BytesRef(key)));
writer.addDocument(doc);
这是删除文档的代码。删除失败,因为找不到文档(尽管它确实存在于索引中)。
void prepareDelete(byte[] documentId) throws IOException {
System.out.println(Arrays.toString(documentId));
Term term =
new Term(DOCUMENT_PRIMARY_KEY, new BytesRef(documentId));
writer.deleteDocuments(term);
}
通过比较打印语句的输出,我确定键是相同的(在它们包含相同字节的意义上),但它们不共享标识。
我使用的是Lucene 4.10.3。
答案 0 :(得分:1)
来自Lucene邮件列表上的回复:
您将字段索引为StoredField,这意味着它不是 实际索引(刚存储),所以没有查询(也不是IW.deleteDocument) 永远都能找到它。
尝试使用StringField ...在最近的版本中,您可以传递BytesRef 对此有价值。
我更新到Lucene 5.3,其中StringField有一个带有BytesRef值的构造函数,这解决了这个问题。