使用lucene來遍歷ES中的文檔數據

es 1.7.5 中使用的是lucene 4.10, 經過研究其數據結構, 明確其嵌套格式(nested)文檔結構.  對於一個分片(目錄)中的數據,是一個lucene索引結構,所以能夠經過使用lucene api來讀取這一個目錄中的數據.實際上,在一個lucene索引結構中,不只有倒排表還有順序結構.所以咱們能夠經過某種方式來獲取這個目錄下面的全部文檔完成遍歷操做.java

順序結構的文檔在lucene4.10中的組織是有規律的,文檔id從0開始遞增,前排文檔的子文檔,而後排其子文檔對應的主文檔. 若是索引子文檔的field字段設置store爲true.則在子文檔所對應的doc id上能夠相關值,不然須要在source字段中獲取,至於如何解析source字段,本篇文章不作解釋.api

首先獲取fields,而後針對某一個term(_uid)來獲取全部文檔(每一個主文檔都有一個惟一的uid).而後根據上面表述的特性就能夠獲取全部文檔相關信息,進行相關處理.若是文檔中涉及到刪除的操做,須要加載刪除數據的集合,而後將文檔id進行過濾,剔除掉刪除的記錄.數據結構

Directory directory = FSDirectory.open(new File(path));
        Lucene40LiveDocsFormat lldf = new Lucene40LiveDocsFormat();
        IOContext context = IOContext.READ;
        SegmentInfos sifs = new SegmentInfos();
        sifs.read(directory);
        Iterator<SegmentCommitInfo> its = sifs.iterator();
        List<Bits> bitss = new ArrayList<Bits>();
        while (its.hasNext()) {
            SegmentCommitInfo info = its.next();
            if (info.hasDeletions())
                bitss.add(lldf.readLiveDocs(directory, info, context));
        }
        // directory.
        IndexReader r = IndexReader.open(directory);
        IndexSearcher is = new IndexSearcher(r);
        Fields fields = MultiFields.getFields(r);
        System.out.println(fields.size());
        Iterator<String> it=fields.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
        System.out.println(fields.terms("commus.interactionIdx").getDocCount());
       
        int count = fields.terms("_uid").getDocCount();
        System.out.println(count);
        for (int i = 0; i < count; i++) {
            Document doc = is.doc(i);
            System.out.println(doc.getFields());
            System.out.println(doc.getField("callId"));
        }
        r.close();
相關文章
相關標籤/搜索