在lucene中添加对象列表

时间:2014-04-16 11:13:47

标签: java 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”?

由于 Samby

2 个答案:

答案 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(基本序列化 - 反序列化规则)。

如有任何关于代码部分的说明,请与我联系。