`

Elasticsearch关键词高亮检索案例分享

阅读更多
1.准备工作
参考文档《集成Elasticsearch Restful API案例》导入和配置es客户端

2.创建索引表和初始化数据
通过组件DocumentCRUD来创建索引表和初始化数据,DocumentCRUD组件实现本文不做重点介绍:
/**
 * 创建索引表,并导入高亮检索功能需要的测试数据
 */
public void initIndiceAndData(){
   DocumentCRUD documentCRUD = new DocumentCRUD();
   documentCRUD.testCreateIndice();
   documentCRUD.testBulkAddDocuments();
}

3.高亮检索功能实现
3.1 定义高亮检索dsl
在文件esmapper/demo.xml中增加testHighlightSearch配置:
    <!--
        一个简单的检索dsl,中有四个变量
        name 全文检索字段
        startTime
        endTime
        通过map传递变量参数值

        变量语法参考文档:https://my.oschina.net/bboss/blog/1556866
    -->
    <property name="testHighlightSearch">
        <![CDATA[{
            "query": {
                "bool": {
                    "filter": [
                        {   ## 时间范围检索,返回对应时间范围内的记录,接受long型的值
                            "range": {
                                "agentStarttime": {
                                    "gte": #[startTime],##统计开始时间
                                    "lt": #[endTime]  ##统计截止时间
                                }
                            }
                        }
                    ],
                    "must": [
                        #*
                        {
                            "query_string": {
                                "query": #[condition],
                                "analyze_wildcard": true
                            }
                        }
                        *#
                        {
                        ## 全文检索参考文档  https://www.elastic.co/guide/en/elasticsearch/reference/6.2/full-text-queries.html
                            "match_phrase" : {
                                "name" : {
                                    "query" : #[condition]
                                }
                            }
                        }
                    ]
                }
            },
            ## 最多返回1000条记录
            "size":1000,
            ## 高亮检索定义,参考文档:https://www.elastic.co/guide/en/elasticsearch/reference/6.2/search-request-highlighting.html
            "highlight": {
                "pre_tags": [
                    "<mark>"
                ],
                "post_tags": [
                    "</mark>"
                ],
                "fields": {
                    "*": {}
                },
                "fragment_size": 2147483647
            }
        }]]>
    </property>

3.2 编写高亮检索代码
创建检索类-org.bboss.elasticsearchtest.HighlightSearch

在其中定义以下方法
	public void highlightSearch() throws ParseException {
		//创建加载配置文件的客户端工具,用来检索文档,单实例多线程安全
		ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil(mappath);
		//设定查询条件,通过map传递变量参数值,key对于dsl中的变量名称
		//dsl中有三个变量
		//        condition
		//        startTime
		//        endTime
		Map<String,Object> params = new HashMap<String,Object>();

		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		//设置时间范围,时间参数接受long值
		params.put("startTime",dateFormat.parse("2017-09-02 00:00:00"));
		params.put("endTime",new Date());
		params.put("condition","喜欢唱歌");//全文检索条件,匹配上的记录的字段值对应的匹配内容都会被高亮显示
		//执行查询,demo为索引表,_search为检索操作action
		ESDatas<Demo> esDatas =  //ESDatas包含当前检索的记录集合,最多1000条记录,由dsl中的size属性指定
				clientUtil.searchList("demo/_search",//demo为索引表,_search为检索操作action
						"testHighlightSearch",//esmapper/demo.xml中定义的dsl语句
						params,//变量参数
						Demo.class);//返回的文档封装对象类型
		//获取总记录数
		long totalSize = esDatas.getTotalSize();
		System.out.println(totalSize);
		//获取结果对象列表,最多返回1000条记录
		List<Demo> demos = esDatas.getDatas();
		for(int i = 0; demos != null && i < demos.size(); i ++){//遍历检索结果列表
			Demo demo = demos.get(i);
			//记录中匹配上检索条件的所有字段的高亮内容
			Map<String,List<Object>> highLights = demo.getHighlight();
			Iterator<Map.Entry<String, List<Object>>> entries = highLights.entrySet().iterator();
			while(entries.hasNext()){
				Map.Entry<String, List<Object>> entry = entries.next();
				String fieldName = entry.getKey();
				System.out.print(fieldName+":");
				List<Object> fieldHighLightSegments = entry.getValue();
				for (Object highLightSegment:fieldHighLightSegments){
					/**
					 * 在dsl中通过<mark></mark>来标识需要高亮显示的内容,然后传到web ui前端的时候,通过为mark元素添加css样式来设置高亮的颜色背景样式
					 * 例如:
					 * <style type="text/css">
					 *     .mark,mark{background-color:#f39c12;padding:.2em}
					 * </style>
					 */
					System.out.println(highLightSegment);
				}
			}
		}
	}

4.运行检索功能
定义junit测试用例:
import org.junit.Test;

import java.text.ParseException;

public class HighlightSearchTest {

	@Test
	public void testHighlightSearch() throws ParseException {
		HighlightSearch highlightSearch = new HighlightSearch();
		highlightSearch.initIndiceAndData();
		highlightSearch.highlightSearch();
	}
	@Test
	public void testHighlightSearchOther() throws ParseException {
		HighlightSearch highlightSearch = new HighlightSearch();
		highlightSearch.initIndiceAndData();
		highlightSearch.highlightSearchOther();
	}
}

在idea或者eclipse中运行测试用例即可,输出检索到的高亮内容信息如下:
name:刘德华<mark>喜</mark><mark>欢</mark><mark>唱</mark><mark>歌</mark>454
name:刘德华<mark>喜</mark><mark>欢</mark><mark>唱</mark><mark>歌</mark>488
name:刘德华<mark>喜</mark><mark>欢</mark><mark>唱</mark><mark>歌</mark>508
name:刘德华<mark>喜</mark><mark>欢</mark><mark>唱</mark><mark>歌</mark>518

5.完整的demo实例工程
https://github.com/bbossgroups/eshelloword-booter

https://gitee.com/bbossgroups/eshelloword-booter

6.参考文档
https://www.elastic.co/guide/en/elasticsearch/reference/6.2/search-request-highlighting.html

https://my.oschina.net/bboss/blog/1801273

5 开发交流
elasticsearch技术交流群:166471282

elasticsearch微信公众号:bbossgroups

1
0
分享到:
评论

相关推荐

    Elastic Search搭建使用教程.pdf(内含ElasticSearch教程权威指南)

    这些应用案例都展示了Elasticsearch在全文搜索、结构化搜索和数据分析方面的强大能力。 Elasticsearch的实时特性意味着它能够在数据被索引后,几乎即时地提供搜索结果。这使得Elasticsearch非常适合于需要快速响应...

    Elasticsearch 案例

    在这个案例中,我们将探讨如何利用Elasticsearch开发一个简易的搜索引擎,实现数据导入、建立索引以及按关键词进行搜索的功能。 首先,我们要了解Elasticsearch的基本概念。索引(Index)是Elasticsearch中的核心...

    Elasticsearch权威指南-搜索测试用例

    此资源因需自备梯子比较难下载,现分享出来... 它被用作全文检索、结构化搜索、分析以及这三个功能的组合: Wikipedia 使用 Elasticsearch 提供带有高亮片段的全文搜索。 这个文件是书籍里面提到的测试用例,提供给大家

    Elasticsearch 集成spring-boot 搜索demo

    本示例"**Elasticsearch 集成spring-boot 搜索demo**"旨在展示如何在Spring Boot应用程序中无缝集成Elasticsearch,以实现高效的数据搜索功能。Elasticsearch是一个分布式、开源的全文搜索引擎,它提供了一个简单而...

    elasticsearch5.5.1中文分词实践过程(亲测可用)

    实践过程涉及了将Elasticsearch应用于中文分词的具体步骤和经验分享。 描述中提到的“避免小白使用过程中遇到的弯路和套路”,意味着文章将提供一些使用Elasticsearch进行中文分词时容易遇到的问题和解决方案。 ...

    Java_Elasticsearch在动作书.zip

    《Java Elasticsearch实战》这本书主要探讨了如何利用Java API与Elasticsearch进行深度集成,从而实现高效的数据检索和分析。Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,广泛应用于日志分析、...

    ElasticSearch7.x入门到案例实战教程

    ElasticSearch应用场景维基百科,类似百度百科,全文检索,高亮,搜索推荐The Guardian(国外新闻网站),类似搜狐新闻,用户行为日志(点击,浏览,收藏,评论)+社交网络数据(对某某新闻的相关看法),数据分析,...

    【中华石杉】Elasticsearch顶尖高手系列-高手进阶篇all

    - **电商搜索优化**:分享在电商网站中如何利用Elasticsearch优化商品搜索体验的最佳实践。 - **实时监控应用**:探讨如何构建基于Elasticsearch的实时监控系统,实现对业务数据的实时跟踪与报警。 通过以上这些...

    lucene全文检索组件

    1. **Solr 和 Elasticsearch**: 为了简化部署和管理,Apache 社区开发了基于 Lucene 的两个企业级搜索引擎:Solr 和 Elasticsearch。它们提供了分布式搜索、集群管理和更丰富的功能。 2. **性能优化**: 通过设置...

    es-demo:elasticsearch相关用例

    本项目"es-demo"是一个关于Elasticsearch的实践案例,旨在展示如何利用Elasticsearch进行数据存储、检索和分析。Elasticsearch是一款开源的全文搜索引擎,以其分布式、实时性、高可扩展性和强大的数据分析能力而广受...

    lucene部分案例的源代码

    在实际应用中,结合Lucene与其他技术,如Solr或Elasticsearch等,可以进一步提升搜索性能和易用性。无论是在企业级应用还是个人项目中,Lucene都是一个不可或缺的工具,值得每一个Java开发者深入研究。

    ES资料ES资料ES资料

    "ES技术资料"可能包含Elasticsearch的安装教程、配置示例、最佳实践、性能优化指南、API参考文档、实战案例分析等内容。通过这些资料,学习者可以深入了解Elasticsearch的使用方法和高级特性,提升在实际项目中的...

    Elasticsearch:MyEsDemo

    Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,广泛应用于日志分析、实时监控、全文检索等领域。在本项目中,开发者将Elasticsearch与Spring数据模块相结合,构建了一个名为"MyEsDemo"的示例应用,...

    Lucene 实战(第2版) PDF高清中文版

    除了基本功能,本书还涵盖了高级主题,如多字段检索、近实时搜索、分布式搜索以及Lucene与其他技术的集成,如Solr和Elasticsearch。这些内容有助于构建大规模、高性能的搜索引擎应用。 对于那些对性能优化感兴趣的...

    Lucene搜索引擎开发进阶实战----高清版

    7. **分布式搜索**:随着数据量的增大,单机搜索可能无法满足需求,因此需要了解如何使用Solr或Elasticsearch这样的基于Lucene的分布式搜索引擎进行集群部署和跨节点搜索。 8. **性能优化**:探讨如何优化Lucene的...

    学习lucence的一个比较好的手册

    Elasticsearch则进一步扩展了Solr的功能,具备更强大的分布式、实时、容错能力,适用于大数据量的搜索引擎搭建。 《Lucene_in_Action.rar》可能是《Lucene in Action》这本书的电子版,这本书详细介绍了Lucene的...

    lucene.net+完全入门教程

    5. **分布式搜索**: 通过Solr或Elasticsearch等工具,可以实现Lucene.Net的分布式搜索,支持大规模数据和高并发。 **四、实战案例** 在实际项目中,Lucene.Net常用于企业级的内部文档检索、电子商务的商品搜索、...

    基于springboot的多媒体素材库源码数据库.zip

    通过集成Elasticsearch,项目可以提供强大的模糊匹配和高亮显示等高级搜索特性。 总的来说,这个基于SpringBoot的多媒体素材库项目展示了Java Web开发的常见技术和最佳实践,包括SpringBoot的使用、数据库设计、...

    lucene资料改集

    Lucene可以与其他开源项目结合使用,如Solr和Elasticsearch,它们在Lucene的基础上提供了更高级的服务,如分布式搜索、集群管理和API封装,更适合大型企业级应用。 **文件内容推测** 由于提供的压缩包文件名称没有...

    Lucene搜索-引擎开发权威经典pdf+源码第二部分

    7. **分布式搜索**:随着数据量的增大,单机索引可能无法满足需求,因此需要了解如何利用Solr或Elasticsearch等基于Lucene的分布式搜索解决方案。 8. **性能优化**:这部分可能涵盖索引和查询性能的优化策略,如...

Global site tag (gtag.js) - Google Analytics