Lucene笔记26-Lucene的使用-自定义QueryParser解决部分查询的性能问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36059561/article/details/83550305

一、使用自定义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");
    }
}

 

猜你喜欢

转载自blog.csdn.net/qq_36059561/article/details/83550305