簡體   English   中英

在lucene中添加對象列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM