版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36059561/article/details/83550305
一、使用自定义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");
}
}