Lucene查询结果高亮

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

检索结果高亮对于用户的体验度和友好度非常重要,可以快速标记出用户检索对关键词。本例中的索引仍使用上一篇博客( 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();
        }
    }

}

结果:
这里写图片描述

目录
相关文章
|
4月前
|
自然语言处理 Java
ElasticSearch 实现分词全文检索 - 高亮查询
ElasticSearch 实现分词全文检索 - 高亮查询
78 0
|
5月前
|
数据库
面试题ES问题之Elasticsearch的排序分页和高亮功能如何解决
面试题ES问题之Elasticsearch的排序分页和高亮功能如何解决
44 0
|
SQL 数据库 索引
08Lucene索引库查询 - 介绍
08Lucene索引库查询 - 介绍
63 0
|
消息中间件 JavaScript 小程序
SpringBoot+ElasticSearch 实现模糊查询,批量CRUD,排序,分页,高亮
SpringBoot+ElasticSearch 实现模糊查询,批量CRUD,排序,分页,高亮
|
自然语言处理 前端开发 Java
|
PHP
【ElasticSearch】结合laravel做高亮搜索
【ElasticSearch】结合laravel做高亮搜索
163 0
【ElasticSearch】结合laravel做高亮搜索
|
自然语言处理 算法 关系型数据库
Elasticsearch能检索出来,但不能正确高亮怎么办?
微信群里的线上实战问题: 诸位大哥,es中: keyword类型的字段进行高亮查询,值为 123asd456,查询 sd4,高亮结果是 em 123asd456 em 有没有办法只对我查询的sd4高亮? 明明查询id的一部分,却高亮结果是整个id串,怎么办? 死磕Elasticsearch技术微信群
560 0
|
存储 自然语言处理 数据库
Lucene 查询原理
# 前言 Lucene 是一个基于 Java 的全文信息检索工具包,目前主流的搜索系统Elasticsearch和solr都是基于lucene的索引和搜索能力进行。想要理解搜索系统的实现原理,就需要深入lucene这一层,看看lucene是如何存储需要检索的数据,以及如何完成高效的数据检索。
8655 1
|
自然语言处理 Apache
Kibana使用之Lucene的语法查询
转载地址 Kibana使用之Lucene的语法查询 Kibana使用的查询语法是Lucene的查询语法,这里在使用Kibana的同事一定要注意,不然,在进行搜索的时候,你会抓狂的。
1966 0
|
前端开发 测试技术 索引
Elasticsearch关键词高亮检索案例分享
1.准备工作 参考文档《集成Elasticsearch Restful API案例》导入和配置es客户端 2.创建索引表和初始化数据 通过组件DocumentCRUD来创建索引表和初始化数据,DocumentCRUD组件实现本文不做重点介绍: /** * 创建索引表,并导入高亮检索...
1634 0