您的位置:首页 > 其它

使用Lucene开发简单的站内新闻搜索引擎(索引的搜索)

2017-05-23 11:30 555 查看
上一篇以及创建好索引,搜索引擎当然少不了搜索。这里为了方便,所以就不把数据保存到数据库,使用Lucene的搜索方法。开始贴代码。

简单的搜索代码

public List<Article> findIndex(String keywords) throws Exception {
List<Article> articles = new ArrayList<Article>();
//Lucene的搜索方法
IndexSearcher indexSearcher = LuceneUtils.getIndexSearcher();
//所要搜索的位置
/**
* 在Lucene中索引的保存都是以键值对的形式保存,所以这里需要指定所要查询的域
*/
String fields[] = {"title", "content", "author"};
//在Lucene中查询的方式还有很多,这里使用简单的MultiPhraseQuery查询
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields, LuceneUtils.getAnalyzer());
Query query = queryParser.parse(keywords);
TopDocs topDocs = indexSearcher.search(query,500);
ScoreDoc[] scoreDocs = topDocs.scoreDocs
for (int i = 0; i < scoreDocs.length; i++) {
//封装查询到的结果
Article article = new Article();
int doc = scoreDocs[i].doc;
Document document = indexSearcher.doc(doc);
article.setId(document.get("id"));
article.setTitle(document.get("title"));
article.setContent(document.get("content"));
article.setUrl(document.get("url"));
article.setAuthor(document.get("author"));
article.setDate(document.get("date"));
articles.add(article);

}
return articles;
}


测试搜索代码

使用单元测试

@Test
public void testsearcher() throws Exception{
String keywords="研讨会";
List<Article> listArticles=luceneDao.findIndex(keywords);
for(Article article:listArticles){
System.out.println(article.getId());
System.out.println(article.getTitle());
System.out.println(article.getAuthor());
System.out.println(article.getUrl());
System.out.println(article.getContent());
System.out.println(article.getDate());
}
}


测试结果



这里可以看出,一共查询到一条记录匹配的。所以的方法测试时成功的

搜索结果高亮显示

在使用搜索引擎的时候,在搜索结果中我们搜索的关键词都会被现实成红色。这就是高亮的效果,帖条码…

//高亮显示的方法,这里的高亮,其实就是给查询的结果添加一个html标签,修改相应的样式
private String Highlighter(Query query, String field, String value) throws Exception {
QueryScorer queryScorer = new QueryScorer(query);
//所要添加的样式
Formatter formatter = new SimpleHTMLFormatter("<span style='color:red;'>", "</span>");
//设置高亮分词器
Highlighter highlighter = new Highlighter(formatter, queryScorer);
highlighter.setTextFragmenter(new SimpleFragmenter(100));
String text = highlighter.getBestFragment(LuceneUtils.getAnalyzer(), field, value);
return text;
}


将上面查询代码修改

public List<Article> findIndex(String keywords) throws Exception {
List<Article> articles = new ArrayList<Article>();
//Lucene的搜索方法
IndexSearcher indexSearcher = LuceneUtils.getIndexSearcher();

String fields[] = {"title", "content", "author"};
//在Lucene中查询的方式还有很多,这里使用简单的MultiPhraseQuery查询
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields, LuceneUtils.getAnalyzer());
Query query = queryParser.parse(keywords);
TopDocs topDocs = indexSearcher.search(query,500);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;

for (int i = 0; i < scoreDocs.length; i++) {
Article article = new Article();
int doc = scoreDocs[i].doc;
Document document = indexSearcher.doc(doc);
article.setId(document.get("id"));
//高亮处理
String title = this.Highlighter(query, "title", document.get("title"));
if (title != null) {
article.setTitle(title);
} else {
article.setTitle(document.get("title"));
}
String content = this.Highlighter(query, "content", document.get("content"));
if (title != null) {
article.setContent(content);
} else {
article.setContent(document.get("content"));
}
article.setUrl(document.get("url"));
article.setAuthor(document.get("author"));
article.setDate(document.get("date"));
articles.add(article);

}
return articles;
}


测试高亮



从结果中可以看出关键词添加了span标签,测试成功。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lucene