【问题标题】:How can I use a byte array as a Lucene index field?如何使用字节数组作为 Lucene 索引字段?
【发布时间】:2015-09-23 14:54:40
【问题描述】:

我将 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);
}

通过比较 print 语句的输出,我确定键是相同的(即它们包含相同的字节),但它们不共享身份。

我使用的是 Lucene 4.10.3。

【问题讨论】:

    标签: java lucene


    【解决方案1】:

    来自 Lucene 邮件列表上发布的答案:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-02-18
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      • 1970-01-01
      相关资源
      最近更新 更多