lucene 基于索引的查询
根据title模糊查询:
根据上一篇文章我们将索引生成到了indexpack 文件夹中:
public String searchInfo(HttpServletRequest request) throws CorruptIndexException, IOException,
InvalidTokenOffsetsException, ParseException {
InvalidTokenOffsetsException, ParseException {
//索引文件保存的路径
String indexpackUrl = InfoService.class.getResource("/").getPath().replaceFirst("/", "")
.replaceAll("WEB-INF/classes/", "")
+ "static/indexpack";
String indexpackUrl = InfoService.class.getResource("/").getPath().replaceFirst("/", "")
.replaceAll("WEB-INF/classes/", "")
+ "static/indexpack";
//读取索引文件
IndexReader indexReader = IndexReader.open(new SimpleFSDirectory(new File(indexpackUrl)));
IndexSearcher indexSearch = new IndexSearcher(indexReader);
IndexReader indexReader = IndexReader.open(new SimpleFSDirectory(new File(indexpackUrl)));
IndexSearcher indexSearch = new IndexSearcher(indexReader);
// 搜索页面传入的参数
String title = request.getParameter("title");
String content = request.getParameter("content");
List<String> fieldsList = new ArrayList<String>();
fieldsList.add("title");
// 单个关键字查询器匹配
// Query query=new TermQuery(new Term("title",title));
// 模糊查查询器
// FuzzyQuery query2=new FuzzyQuery(new
// Term("title","*"+title+"*"),0.1f);
// WildcardQuery query3 = new WildcardQuery(new Term("title", title));
//多个查询组合用到的 可以and 多个query
BooleanQuery booleanQueryHighlighter = new BooleanQuery();
String[] fields = (String[]) fieldsList.toArray(new String[fieldsList.size()]);
String content = request.getParameter("content");
List<String> fieldsList = new ArrayList<String>();
fieldsList.add("title");
// 单个关键字查询器匹配
// Query query=new TermQuery(new Term("title",title));
// 模糊查查询器
// FuzzyQuery query2=new FuzzyQuery(new
// Term("title","*"+title+"*"),0.1f);
// WildcardQuery query3 = new WildcardQuery(new Term("title", title));
//多个查询组合用到的 可以and 多个query
BooleanQuery booleanQueryHighlighter = new BooleanQuery();
String[] fields = (String[]) fieldsList.toArray(new String[fieldsList.size()]);
//前面讲了多种查询器 这种方式为统一的 不用自己判断使用哪种查询器 解决了我的中文搜索不到的问题
QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30, fields,
new StandardAnalyzer(Version.LUCENE_30));
QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30, fields,
new StandardAnalyzer(Version.LUCENE_30));
Query query4 = parser.parse(title);
// 一定包含 Occur.MUST
booleanQueryHighlighter.add(query4, Occur.MUST);
//查询的结果
TopDocs topdocs = indexSearch.search(booleanQueryHighlighter, null, 10);
StringBuilder builder = new StringBuilder();
// 高亮显示
Highlighter highLighter = null;
SimpleHTMLFormatter fomater = new SimpleHTMLFormatter("<font color='red'>", "</font>");
highLighter = new Highlighter(fomater, new QueryScorer(booleanQueryHighlighter));
highLighter.setTextFragmenter(new SimpleFragmenter(Integer.MAX_VALUE));
for (ScoreDoc doc : topdocs.scoreDocs) {
Document document = indexSearch.doc(doc.doc);
TokenStream tokenStream = new StandardAnalyzer(Version.LUCENE_30).tokenStream("token",
new StringReader(document.get("title")));
String str = highLighter.getBestFragment(tokenStream, document.get("title"));
builder.append(str);
}
return builder.toString();
}
TopDocs topdocs = indexSearch.search(booleanQueryHighlighter, null, 10);
StringBuilder builder = new StringBuilder();
// 高亮显示
Highlighter highLighter = null;
SimpleHTMLFormatter fomater = new SimpleHTMLFormatter("<font color='red'>", "</font>");
highLighter = new Highlighter(fomater, new QueryScorer(booleanQueryHighlighter));
highLighter.setTextFragmenter(new SimpleFragmenter(Integer.MAX_VALUE));
for (ScoreDoc doc : topdocs.scoreDocs) {
Document document = indexSearch.doc(doc.doc);
TokenStream tokenStream = new StandardAnalyzer(Version.LUCENE_30).tokenStream("token",
new StringReader(document.get("title")));
String str = highLighter.getBestFragment(tokenStream, document.get("title"));
builder.append(str);
}
return builder.toString();
}