如何将字节数组用作Lucene索引字段?

时间:2015-09-23 14:54:41

标签: java lucene

我将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。

1 个答案:

答案 0 :(得分:1)

来自Lucene邮件列表上的回复:

  

您将字段索引为StoredField,这意味着它不是   实际索引(刚存储),所以没有查询(也不是IW.deleteDocument)   永远都能找到它。

     

尝试使用StringField ...在最近的版本中,您可以传递BytesRef   对此有价值。

我更新到Lucene 5.3,其中StringField有一个带有BytesRef值的构造函数,这解决了这个问题。