Lucene查询结果高亮

检索结果高亮对于用户的体验度和友好度非常重要,可以快速标记出用户检索对关键词。本例中的索引仍使用上一篇博客(Lucene查询索引)中创建的索引,代码高亮参考了Lucene4.x高亮 fast高亮 前端高亮

实现效果:

核心代码

package ucas.ir.lucene;

import java.io.File;
import java.io.IOException;

import javax.print.Doc;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.core.KeywordAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.highlight.Fragmenter;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.search.highlight.SimpleSpanFragmenter;
import org.apache.lucene.search.highlight.TokenSources;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;

public class IndexSearch {

    public static void main(String[] args) {
        Directory directory = null;
        try {
            File indexpath = new File("/Users/yp/Documents/workspace/UCASIR/WebContent/index");
            if (indexpath.exists() != true) {
                indexpath.mkdirs();
            }
            // 设置要查询的索引目录
            directory = FSDirectory.open(indexpath);
            // 创建indexSearcher
            DirectoryReader dReader = DirectoryReader.open(directory);
            IndexSearcher searcher = new IndexSearcher(dReader);
            // 设置分词方式
            Analyzer analyze2 = new StandardAnalyzer(Version.LUCENE_43);// 标准分词
            Analyzer analyzer = new IKAnalyzer();

            // 设置查询域
            String field="news_title";
            QueryParser parser = new QueryParser(Version.LUCENE_43, field, analyzer);
            // 查询字符串
            Query query = parser.parse("阿法狗");

            QueryScorer scorer=new QueryScorer(query,field);
            SimpleHTMLFormatter fors=new SimpleHTMLFormatter("<span style=\"color:red;\">", "</span>");
            Highlighter highlighter=new Highlighter(fors, scorer);

            System.out.println("query:" + query.toString());
            // 返回前10条
            TopDocs topDocs = searcher.search(query, 10);
            if (topDocs != null) {
                System.out.println("符合条件第文档总数:" + topDocs.totalHits);

                for (int i = 0; i < topDocs.scoreDocs.length; i++) {
                    Document doc = searcher.doc(topDocs.scoreDocs[i].doc);
                    TokenStream tokenStream=TokenSources.getAnyTokenStream(searcher.getIndexReader(), topDocs.scoreDocs[i].doc, field, analyzer);
                    Fragmenter  fragment=new SimpleSpanFragmenter(scorer);
                    highlighter.setTextFragmenter(fragment);
                    //高亮news_title域
                    String str=highlighter.getBestFragment(tokenStream, doc.get("news_title"));//获取高亮的片段,可以对其数量进行限制
                    System.out.println("高亮title:"+str);
                    tokenStream=TokenSources.getAnyTokenStream(searcher.getIndexReader(), topDocs.scoreDocs[i].doc, "news_summary", analyzer);
                    str=highlighter.getBestFragment(tokenStream, doc.get("news_summary"));//获取高亮的片段,可以对其数量进行限制
                    System.out.println("高亮summary:"+str);
                }
            }
            directory.close();
            dReader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

结果:

时间: 2024-10-02 09:28:41

Lucene查询结果高亮的相关文章

Lucene学习:lucene查询

1.1. Lucene查询 在学习Lucene的查询方法前,先了解一下下面几个类: 1.1.1. Query 封装某种查询类型的具体子类,配置查询的查询条件.Query实例将被传递给IndexSearcher的search方法.下面是常用的Query子类: l 通过项进行搜索 TermQuery类 l 在指定的项范围内搜索 TermRangeQuery类 l 通过字符串搜索 PrefixQuery类 l 组合查询 BooleanQuery类 l 通过短语搜索 PhraseQuery类 l 通配符

Lucene 查询分页技术

常用的Lucene查询代码如下所示,该代码的作用是将path路径下的所有索引信息返回 1 public String matchAll(String path) { 2 try { 3 Directory directory = FSDirectory.open(new File(path)); 4 DirectoryReader reader = DirectoryReader.open(directory); 5 IndexSearcher searcher = new IndexSearc

lucene 查询的使用

各种查询 方式一:使用QueryParser与查询语法.(会使用分词器) MultiFieldQueryParser 查询字符串 ------------------------> Query对象 例如: 上海 AND 天气 上海 OR 天气 上海新闻 AND site:news.163.com ... 方式二: 直接创建Query的实例(子类的),不会使用分词器 new TermQuery(..); new BooleanQuery(..); 1 package cn.itcast.i_que

Lucene查询条数限制

运用Lucene进行索引,在查询的时候是有条数限制的 1 public virtual TopFieldDocs Search(Query query, Filter filter, int n, Sort sort); 可以看到第三个参数是int类型,所以返回的条数为int最大值.因为Lucene为索引查询,所以不需要返回全部的数据,根据关键词返回匹配的数据,按照分值排序,int大小的数据足够筛选出匹配的正确数据.在运用Lucene查询的是否不易返回过多条数,这样会影响性能,一般1000条左右

Lucene查询语法详解

Lucene查询语法以可读的方式书写,然后使用JavaCC进行词法转换,转换成机器可识别的查询. 词语查询(Terms) 单词,例如:"test","hello" 语句,例如:"hello,world!" 字段查询(Field) title:hello 或者 title:"hello title" //搜索title为 hello title关键字的文档 title:hello title //搜索title为hello,或者

Lucene实现自定义分词器(同义词查询与高亮)

今天我们实现一个简单的分词器,仅仅做演示使用功能如下: 1.分词按照空格.横杠.点号进行拆分: 2.实现hi与hello的同义词查询功能: 3.实现hi与hello同义词的高亮显示: MyAnalyzer实现代码: public class MyAnalyzer extends Analyzer { private int analyzerType; public MyAnalyzer(int type) { super(); analyzerType = type; } @Override p

lucene查询索引之解析查询——(八)

0.语法介绍: 1.公共部分代码同七中一样 // IndexReader IndexSearcher public IndexSearcher getIndexSearcher() throws Exception { // 第一步:创建一个Directory对象,也就是索引库存放的位置. Directory directory = FSDirectory.open(new File("E:\\lucene&solr\\index"));// 磁盘 // 第二步:创建一个ind

kibana使用的lucene查询语法

kibana在ELK阵营中用来查询展示数据elasticsearch构建在Lucene之上,过滤器语法和Lucene相同 kibana4官方演示页面 全文搜索 在搜索栏输入login,会返回所有字段值中包含login的文档 使用双引号包起来作为一个短语搜索"like Gecko" 字段 也可以按页面左侧显示的字段搜索限定字段全文搜索:field:value精确搜索:关键字加上双引号 filed:"value"http.code:404 搜索http状态码为404的文

lucene查询索引之Query子类查询——(七)

0.文档名字:(根据名字索引查询文档) 1. 提取获取InsexSearch 与 处理结果的公共代码 //IndexReader IndexSearcher public IndexSearcher getIndexSearcher() throws Exception{ // 第一步:创建一个Directory对象,也就是索引库存放的位置. Directory directory = FSDirectory.open(new File("D:\\temp\\index"));// 磁