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

来源:互联网 发布:电子图章制作软件 编辑:程序博客网 时间:2024/06/06 08:54

上一篇以及创建好索引,搜索引擎当然少不了搜索。这里为了方便,所以就不把数据保存到数据库,使用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;}

测试搜索代码

使用单元测试

@Testpublic 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标签,测试成功。

阅读全文
0 0
原创粉丝点击