Lucene筆記29-Lucene的使用-自定義Filter-合理的設計方式
阿新 • • 發佈:2018-11-29
一、優化程式碼
我們知道,直接傳入字串陣列是不可行的,這種模式就寫“死”了,前面講到面向介面程式設計,需要用到什麼樣子的實現類就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(); } }