gpt4 book ai didi

lucene - 在 lucene 中存储非索引二进制数据

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

如何将非索引字节数组存储到 lucene 文档中?

我已经尝试过这些:

     doc.add(new Field("bin1", new InputStreamReader(new ByteArrayInputStream(new byte [100000]))));
doc.add(new BinaryDocValuesField("bin2", new BytesRef(new byte [100000])));

没有任何效果(字段未存储,查询时无法检索)

测试代码:

  String index="dms1";

Directory indexDirectory = FSDirectory.open(Paths.get(index));
StandardAnalyzer analyzer = new StandardAnalyzer();
IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
iwc.setOpenMode(IndexWriterConfig.OpenMode
.CREATE
);
//create the indexer
IndexWriter iw = new IndexWriter(indexDirectory, iwc);

{
Document doc = new Document();

doc.add(new TextField("id", "1", Field.Store.YES));
doc.add(new Field("bin1", new InputStreamReader(new ByteArrayInputStream(new byte [100000]))));
doc.add(new BinaryDocValuesField("bin2", new BytesRef(new byte [100000])));

iw.addDocument(doc);
iw.commit();
}

DirectoryReader ir = DirectoryReader.open(indexDirectory);

IndexSearcher is = new IndexSearcher(ir);


QueryParser qp = new QueryParser(
"",
analyzer);
Query q = qp.parse(
//"content1:hp"
"*:*"
);
TopDocs hits = is.search(q, 10);

for (ScoreDoc scoreDoc : hits.scoreDocs) {
Document doc = is.doc(scoreDoc.doc);

System.out.println(doc);

System.out.println("doc.getBinaryValue(bin1):" + doc.getBinaryValue("bin1"));;
System.out.println("doc.getBinaryValues(bin1):" + doc.getBinaryValues("bin1"));;
System.out.println("doc.getBinaryValues(bin1).length:" + doc.getBinaryValues("bin1").length);;
System.out.println("doc.get(bin1):" + doc.get("bin1"));;

System.out.println("doc.getBinaryValue(bin2):" + doc.getBinaryValue("bin2"));;
System.out.println("doc.getBinaryValues(bin2):" + doc.getBinaryValues("bin2"));;
System.out.println("doc.getBinaryValues(bin2).length:" + doc.getBinaryValues("bin2").length);;
System.out.println("doc.get(bin2):" + doc.get("bin2"));;
}

输出:

    Document<stored,indexed,tokenized<id:1>>
doc.getBinaryValue(bin1):null
doc.getBinaryValues(bin1):[Lorg.apache.lucene.util.BytesRef;@899e53
doc.getBinaryValues(bin1).length:0
doc.get(bin1):null
doc.getBinaryValue(bin2):null
doc.getBinaryValues(bin2):[Lorg.apache.lucene.util.BytesRef;@f98160
doc.getBinaryValues(bin2).length:0
doc.get(bin2):null

有人可以阐明如何存储字节以及如何再次检索值吗?

我知道使用base64或其他编码将字节转换为文本或将其存储为文件链接的其他解决方案,但我需要知道的是一种更有效的方法来做到这一点,因为lucene API具有“二进制”方法,所以我认为这应该是正确的方法。

lucene版本:5.3.1

最佳答案

使用 StoredField 。您可以将 BytesRef 或字节数组本身传递到字段中:

byte[] myByteArray = new byte[100000];
document.add(new StoredField("bin1", myByteArray));

就检索值而言,您已经走在正确的轨道上了。像这样的东西:

Document resultDoc = searcher.doc(docno);
BytesRef bin1ref = resultDoc.getBinaryValue("bin1");
bytes[] bin1bytes = bin1ref.bytes;

顺便说一下,您尝试过的两个字段的问题:

  • bin1:当您将读取器传递到 Field 构造函数时,它决定将其视为 TextField,它将被索引而不是存储,实际上与您正在寻找的相反。无论如何,该构造函数已被弃用,只支持使用 TextField

    如果您选择只传递 byte[] 而不是 Reader,它实际上会起作用,因为它将充当 >StoredField(如上所示),尽管该构造函数也已弃用)。

  • bin2:DocValuesField 的工作方式不同。您可以read up a bit on that here ,如果你好奇的话。

关于lucene - 在 lucene 中存储非索引二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34324239/

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