Lucene多字段查询&高亮显示

  • 在百度搜索的时候,查询的关键词会高亮显示
  • 在搜索一个关键词的时候,有可能这个关键词在title和content中,搜索的时候要把结果全部显示出来

实例说明

package com.bart.lucene.mutilseacher;

import java.util.ArrayList;
import java.util.List;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
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.search.highlight.Formatter;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.Scorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.junit.Test;
import com.bart.lucene.entity.Article;
import com.bart.lucene.util.LuceneUtils;


/**
 * Article多条件搜索加高亮显示
 * @author hp
 */
public class ArticleDao {

    /**
     * 高亮显示
     * 查询索引库中所有的记录
     * @throws Exception 
     */
    @Test
    public void findAll() throws Exception{
        String keyword = "显卡";
        List<Article>articleList = new ArrayList<Article>(); 
        IndexSearcher indexSearcher = new  IndexSearcher(LuceneUtils.getDirectory());
        //默认之搜索一个字段,单条件搜索
        //QueryParser queryParser = new QueryParser(LuceneUtils.getVersion(),"content",LuceneUtils.getAnalyzer());
        //搜索多个字段,多条件搜索
        QueryParser queryParser2 = new MultiFieldQueryParser(LuceneUtils.getVersion(),new String[]{"title","content"},LuceneUtils.getAnalyzer());

        //Query query = queryParser.parse(keyword);
        Query query = queryParser2.parse(keyword);
        TopDocs topDocs = indexSearcher.search(query,100);

        //以下代码对查询结果进行高亮显示
        // 1.格式化对象,设置前缀和后缀
        Formatter formatter = new SimpleHTMLFormatter("<font color='red'>","</font>");
        // 2.关键词对象
        Scorer scorer = new QueryScorer(query);
        // 3. 高亮对象
        Highlighter highlighter = new Highlighter(formatter, scorer);


        for(int i=0;i<topDocs.scoreDocs.length;i++){
            ScoreDoc scoreDoc = topDocs.scoreDocs[i];
            int no = scoreDoc.doc;

            //关键词没有高亮
            Document document = indexSearcher.doc(no);

            // 1. 关键词添加高亮
            String titleHighLight  = highlighter.getBestFragment(LuceneUtils.getAnalyzer(),"title",document.get("title"));
            String contentHighLight  = highlighter.getBestFragment(LuceneUtils.getAnalyzer(),"content",document.get("content"));
            // 2. 将高亮的结果再次封装到document对象中
            document.getField("title").setValue(titleHighLight);
            document.getField("content").setValue(contentHighLight);

            Article article = LuceneUtils.document2JavaBean(document,Article.class);
            articleList.add(article);
        }

        //遍历
        for(Article a : articleList){
            System.out.println(a);
        }
    }

    /**
     * 增加document对象到对象索引库中
     * @throws Exception
     */
    @Test
    public void testCreate() throws Exception{
        Article article = new Article(1,"显卡","显卡是电脑的核心部件",10);
        Document document = LuceneUtils.javaBean2Document(article);
        IndexWriter indexWriter = new IndexWriter(LuceneUtils.getDirectory(), LuceneUtils.getAnalyzer(), LuceneUtils.getMaxFieldLength());
        indexWriter.addDocument(document);
        //设置当插入三条记录的时候合并到同一条记录,默认是10个缓存就合并索引的cfs文件
        indexWriter.setMergeFactor(3);
//        //合并记录,不管插入多少条
//        indexWriter.optimize();
        indexWriter.close();
    }


}

输出结果:
Article [id=1, title=, content=是电脑的核心部件, count=10]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值