[英]add list of objects in lucene
我使用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”?
謝謝桑比
這樣做的方法有很多,有時取決於您的業務。
我們遇到了相同的情況,在這種情況下我們所做的如下:
第一
我們確定應添加到索引的字段及其類型。 在此確定字段值的類型,將其設置為單個值還是列表等。
第二
如果字段是像您的案例那樣的對象列表,我們只需遍歷該列表,然后將該對象中的每個字段添加為單獨的(有時),或者將該對象字段值組合為一個String值,然后將其添加為a。
例如 :
for (B b : list) {
luceneDoc.add(new TextField(KEY, b.getName(), STORE_TYPE));
luceneDoc.add(new TextField(KEY, b.getDate(), STORE_TYPE));
}
要么
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為例,您應該根據業務使用字段類型。
這是一個古老的問題,我沒有看到任何回應- 我們能否將類重構為對象? 所以在這里回答。
基本上,您必須使用序列化和反序列化來存儲和檢索復雜對象作為Lucene Document字段。
我關注了這篇文章
我正在使用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);
基本上,我有類型的POJO - StartBean
與實例作為startBean
。 它有一個String字段,我將startBean
用作Lucene索引字段,並將完整的startBean
作為byte[]
存儲在Lucene索引中。
然后在搜索時,如果找到了匹配項,
我願意- 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
(基本序列化-反序列化規則)。
讓我知道任何代碼部分的澄清。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.