Lucene筆記26-Lucene的使用-自定義QueryParser解決部分查詢的效能問題
阿新 • • 發佈:2018-11-03
一、使用自定義QueryParser的原因
- 對於某些QueryParser(FuzzyQuery、WildcardQuery)在查詢時會使得效能降低,所以考慮將這些查詢取消。
- 在具體的查詢時候,很可能有這樣一種需求:獲取的是一個數字查詢範圍,所以必須要擴充套件原有的QueryParser才能進行。
二、實現方法
自定義QueryParser類,繼承QueryParser類,並重寫響應方法,實現自己的邏輯。這裡的例子是:禁用模糊查詢和萬用字元查詢,當出現模糊查詢或萬用字元查詢的時候,直接丟擲一個異常提示使用者。
三、實現程式碼
package com.wsy; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.IndexReader; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; public class CustomParser extends QueryParser { private static Directory directory; private static IndexReader indexReader; private static Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35); static { try { directory = FSDirectory.open(new File("E:\\Lucene\\IndexLibrary")); indexReader = IndexReader.open(directory); } catch (IOException e) { e.printStackTrace(); } } public CustomParser(Version matchVersion, String f, Analyzer a) { super(matchVersion, f, a); } @Override protected Query getWildcardQuery(String field, String termStr) throws ParseException { throw new ParseException("由於效能原因,已經禁用了萬用字元查詢,請輸入更精確的資訊進行查詢查詢"); } @Override protected Query getFuzzyQuery(String field, String termStr, float minSimilarity) throws ParseException { throw new ParseException("由於效能原因,已經禁用了模糊查詢,請輸入更精確的資訊進行查詢查詢"); } public void searchByQuery(String value) { try { CustomParser customParser = new CustomParser(Version.LUCENE_35, "content", analyzer); Query query = customParser.parse(value); IndexSearcher indexSearcher = new IndexSearcher(indexReader); TopDocs topDocs = indexSearcher.search(query, 100); ScoreDoc[] scoreDocs = topDocs.scoreDocs; SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for (ScoreDoc scoreDoc : scoreDocs) { Document document = indexSearcher.doc(scoreDoc.doc); // 依次輸出文件id,文件得分,文件名字,文件路徑,文件大小,文件修改時間 System.out.println(scoreDoc.doc + "-->" + scoreDoc.score + "-->" + document.get("fileName") + "-->" + document.get("path") + "-->" + document.get("size") + "-->" + simpleDateFormat.format(new Date(Long.valueOf(document.get("date"))))); } indexSearcher.close(); } catch (IOException e) { e.printStackTrace(); } catch (ParseException e) { System.err.println(e.getMessage()); } } public static void main(String[] args) { CustomParser customParser = new CustomParser(Version.LUCENE_35, "content", analyzer); // 模糊查詢 customParser.searchByQuery("java~"); // 萬用字元查詢 customParser.searchByQuery("*java"); } }