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

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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值