我使用lucene 4.7.0来存储数据。我想在lucene文档中添加对象列表。例如,
Class A{
private List<B> listOfB;
private String field1;
}
Class B {
private String name;
private String date;
}
我想添加直接前进的field1但是如何在A的lucene文档中存储“listofB”?
由于 Samby
答案 0 :(得分:1)
有很多方法可以这样做,有些时候这取决于您的业务。
我们遇到了同样的情况,我们在这种情况下所做的如下:
<强>第一强>
我们确定应添加到索引及其类型的字段。这里的类型确定字段值,将其单个值或列表等天气。
<强>第二强>
如果字段是像你的情况一样的对象列表,我们只需循环遍历该列表并将该对象中的每个字段添加为单独的(有时),或者将该对象字段值组合为一个字符串值,然后将其添加为。
例如:
for (B b : list) {
luceneDoc.add(new TextField(KEY, b.getName(), STORE_TYPE));
luceneDoc.add(new TextField(KEY, b.getDate(), STORE_TYPE));
}
OR
for (B b : list) {
luceneDoc.add(new TextField(KEY, getBfieldsValue(b), STORE_TYPE));//getBfieldsValue(b) should return a one String value from all B fields.
}
注意: 我使用TextField作为示例,您应该根据您的业务使用字段类型。
答案 1 :(得分:0)
这是一个老问题而且我没有看到对 - 我们能够重新构建一个对象吗?所以回答这里。
基本上,您必须使用序列化和反序列化来存储和检索复杂对象作为Lucene Document字段。
我关注this article
我正在使用Lucene 6.6。以下是作为索引和搜索的一部分的示例代码,
Document doc = new Document();
doc.add(new TextField("content", startBean.getIndexable(), Field.Store.NO));
ByteArrayOutputStream serData=new ByteArrayOutputStream();
ObjectOutputStream out=new ObjectOutputStream(serData);
try {
out.writeObject(startBean);
} finally {
out.close();
serData.close();
}
FieldType filedType = new FieldType();
filedType.setStored(true);
filedType.setTokenized(false);
doc.add(new Field("storedcontent",serData.toByteArray(),filedType));
writer.addDocument(doc);
基本上,我有一个类型为StartBean
的POJO,实例为startBean
。它有一个String字段,我将其用作lucene索引字段,并在Lucene索引中将startBean
存储为byte[]
。
然后在搜索时,如果找到了匹配,
我做 - Document doc = searcher.doc(hit.doc);
然后调用下面的方法 - StartBean startBean = getStartBean(doc);
来重建我的对象。
private StartBean getStartBean(Document document) throws ClassNotFoundException, IOException{
StartBean startBean = null;
BytesRef binaryValue = document.getBinaryValue("storedcontent");
if(null != binaryValue){
System.out.println("binaryValue is non null ");
byte[] bytes = binaryValue.bytes;
ObjectInputStream in=new ObjectInputStream(new
ByteArrayInputStream(bytes));
try {
startBean = (StartBean) in.readObject();
} finally {
in.close();
}
}
return startBean;
}
您必须确保父对象和嵌套对象是Serializable
或标记为transient
(基本序列化 - 反序列化规则)。
如有任何关于代码部分的说明,请与我联系。