1. 程式人生 > >Lucene筆記26-Lucene的使用-自定義QueryParser解決部分查詢的效能問題

Lucene筆記26-Lucene的使用-自定義QueryParser解決部分查詢的效能問題

一、使用自定義QueryParser的原因

  1. 對於某些QueryParser(FuzzyQuery、WildcardQuery)在查詢時會使得效能降低,所以考慮將這些查詢取消。
  2. 在具體的查詢時候,很可能有這樣一種需求:獲取的是一個數字查詢範圍,所以必須要擴充套件原有的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");
    }
}