1. 程式人生 > >Lucene筆記29-Lucene的使用-自定義Filter-合理的設計方式

Lucene筆記29-Lucene的使用-自定義Filter-合理的設計方式

一、優化程式碼

我們知道,直接傳入字串陣列是不可行的,這種模式就寫“死”了,前面講到面向介面程式設計,需要用到什麼樣子的實現類就new一個實現類即可。

二、具體程式碼

package com.wsy;

public interface MyFilterAccessor {
    public String[] values();

    public String getField();
}

class MyFilterImpl implements MyFilterAccessor {
    @Override
    public String[] values() {
        return new String[]{"1", "3", "5"};
    }

    @Override
    public String getField() {
        return "id";
    }
}

在上一節的MyFilter類中,新增MyFilterAccessor屬性,在MyFilter建構函式中對MyFilterAccessor物件初始化。原來的for迴圈優化成下面的樣子。用myFilterAccessor.values()替代了之前寫死的字串陣列,用myFilterAccessor.getField()替代了之前寫死的field。

for (String deleteId : myFilterAccessor.values()) {
    // 獲取TermDocs
    TermDocs termDocs = indexReader.termDocs(new Term(myFilterAccessor.getField(), deleteId));
    // 將查詢出來的物件的位置存在docs中,將查詢出現的頻率存放在freqs中,返回查詢出來的條數
    int count = termDocs.read(docs, freqs);
    // count == 1表明這個是主鍵
    System.out.println("count=" + count + "\tdocs=" + docs[0] + "\tfreqs=" + freqs[0]);
    if (count == 1) {
        // 將這個位置的元素刪除
        openBitSet.clear(docs[0]);
    }
}

同時又寫了兩個方法,一個是用來set的,一個是用來clear的。

private void set(IndexReader indexReader, OpenBitSet openBitSet) {
    try {
        int[] docs = new int[1];
        int[] freqs = new int[1];
        for (String deleteId : myFilterAccessor.values()) {
            // 獲取TermDocs
            TermDocs termDocs = indexReader.termDocs(new Term(myFilterAccessor.getField(), deleteId));
            // 將查詢出來的物件的位置存在docs中,將查詢出現的頻率存放在freqs中,返回查詢出來的條數
            int count = termDocs.read(docs, freqs);
            // count == 1表明這個是主鍵
            System.out.println("count=" + count + "\tdocs=" + docs[0] + "\tfreqs=" + freqs[0]);
            if (count == 1) {
                openBitSet.set(docs[0]);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
private void clear(IndexReader indexReader, OpenBitSet openBitSet) {
    try {
        openBitSet.set(0, indexReader.maxDoc() - 1);
        // 獲取需要被過濾掉的docId,將它的值清空
        int[] docs = new int[1];
        int[] freqs = new int[1];
        for (String deleteId : myFilterAccessor.values()) {
            // 獲取TermDocs
            TermDocs termDocs = indexReader.termDocs(new Term(myFilterAccessor.getField(), deleteId));
            // 將查詢出來的物件的位置存在docs中,將查詢出現的頻率存放在freqs中,返回查詢出來的條數
            int count = termDocs.read(docs, freqs);
            // count == 1表明這個是主鍵
            System.out.println("count=" + count + "\tdocs=" + docs[0] + "\tfreqs=" + freqs[0]);
            if (count == 1) {
                openBitSet.clear(docs[0]);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}