Elasticsearch的详细讲解
认识Elasticsearch是什么
Elasticsearch是一个搜索引擎 , 其本质就是一个非关系性数据库
什么是搜索引擎
所谓搜索引擎就是根据用户需求与一定的算法 , 运用特定的策略从互联网检索出指定信息反馈给用户的一门技术,搜索引擎依托于多种技术 , 如网络爬虫技术,检索排序技术,网页处理技术,大数据处理技术,自然语言处理技术等,为信息检索用户提供快速,高相关性的信息服务,搜索引擎技术的核心模快一般包括爬虫,索引,检索和排序等,同时可以添加其他一系列辅助模快,以为用户创造更好的网络环境
搜索引擎的分类
全文搜索引擎
一般网络用户适用于搜索引擎,这种搜索方式方便,简洁,并容易获得所有相关的信息 ,但由于搜索的信息过于繁杂,因此用户需要逐一浏览选出所需信息,尤其在用户没有明确检索信息的情况下,这种搜索方式非常有效
元搜索引擎
元搜索适合用于广泛,准确的收集信息不同的全文搜索引擎由于其性能和信息反馈能力差异,导致其各有利弊。元搜索引擎的出现恰恰解决了这个问题,有利于各基本搜索引擎间的优势互补。而且本搜索方式有利于对基本搜索方式进行全局控制,引导全文搜索引擎的持续改善
垂直搜索引擎
垂直搜索引擎适用于有明确搜索意图情况下进行检索。例如,用户购买机票、火车票、汽车票时,或想要浏览网络视频资源时,都可以直接选用行业内专用搜索引擎,以准确、迅速获得相关信息
目录搜索引擎
目录搜索引擎是网站内部常用的检索方式。本搜索方式指在对网站内信息整合处理并分目录呈现给用户,但其缺点在于用户需预先了解本网站的内容,并熟悉其主要模块构成。总而观之,目录搜索方式的适应范围非常有限,且需要较高的人工成本来支持维护
新网页搜索引擎
2022年6月3号,苹果推出以用户为中心的新网页搜索引擎
发展趋势
社会性搜索
社交网络平台和应用占据了互联网的主流,社交网络平台强调用户之间的联系和交互,这对传统的搜索技术提出了新的挑战。
传统搜索技术强调搜索结果和用户需求的相关性,社会化搜索除了相关性外,还额外增加了一个维度,即搜索结果的可信赖性。对某个搜索结果,传统的结果可能成千上万,但如果处于用户社交网络内其他用户发布的信息、点评或验证过的信息则更容易信赖,这是与用户的心里密切相关的。社会化搜索为用户提供更准确、更值得信任的搜索结果。
实时搜索
对搜索引擎的实时性要求日益增高,这也是搜索引擎未来的一个发展方向
实时搜索最突出的特点是时效性强,越来越多的突发事件首次发布在微博上,实时搜索核心强调的就是“快”,用户发布的信息第一时间能被搜索引擎搜索到。不过在国内,实时搜索由于各方面的原因无法普及使用,比如Google的实时搜索是被重置的,百度也没有明显的实时搜索入口
移动搜索
随着智能手机的快速发展,基于手机的移动设备搜索日益流行,但移动设备有很大的局限性,比如屏幕太小,可显示的区域不多,计算资源能力有限,打开网页速度很慢,手机输入繁琐等问题都需要解决。
目前,随着智能手机的快速普及,移动搜索一定会更加快速的发展,所以移动搜索的市场占有率会逐步上升,而对于没有移动版的网站来说,百度也提供了“百度移动开放平台”来弥补这个缺失
个性化搜索
个性化搜索主要面临两个问题:如何建立用户的个人兴趣模型?在搜索引擎里如何使用这种个人兴趣模型?
个性化搜索的核心是根据用户的网络行为,建立一套准确的个人兴趣模型。而建立这样一套模型,就要全民收集与用户相关的信息,包括用户搜索历史、点击记录、浏览过的网页、用户E-mail信息、收藏夹信息、用户发布过的信息、博客、微博等内容。比较常见的是从这些信息中提取出关键词及其权重。为不同用户提供个性化的搜索结果,是搜索引擎总的发展趋势,但现有技术有很多问题,比如个人隐私的泄露,而且用户的兴趣会不断变化,太依赖历史信息,可能无法反映用户的兴趣变化
地理位置感知搜索
目前,很多手机已经有GPS的应用了,这是基于地理位置感知的搜索,而且可以通过陀螺仪等设备感知用户的朝向,基于这种信息,可以为用户提供准确的地理位置服务以及相关搜索服务。目前,此类应用已经大行其道,比如手机地图APP
跨语言搜索
如何将中文的用户查询翻译为英文查询,目前主流的方法有3种:机器翻译、双语词典查询和双语语料挖掘。对于一个全球性的搜索引擎来说,具备跨语言搜索功能是必然的发展趋势,而其基本的技术路线一般会采用查询翻译加上网页的机器翻译这两种技术手段
多媒体搜索
目前,搜索引擎的查询还是基于文字的,即使是图片和视频搜索也是基于文本方式。那么未来的多媒体搜索技术则会弥补查询这一缺失。多媒体形式除了文字,主要包括图片、音频、视频。多媒体搜索比纯文本搜索要复杂许多,一般多媒体搜索包含4个主要步骤:多媒体特征提取、多媒体数据流分割、多媒体数据分类和多媒体数据搜索引擎
情景搜索
情境搜索是融合了多项技术的产品,上面介绍的社会化搜索、个性化搜索、地点感知搜索等都是支持情境搜索的,目前Google在大力提倡这一概念。所谓情境搜索,就是能够感知人与人所处的环境,针对“此时此地此人”来建立模型,试图理解用户查询的目的,根本目标还是要理解人的信息需求。比如某个用户在苹果专卖店附近发出“苹果”这个搜索请求,基于地点感知及用户的个性化模型,搜索引擎就有可能认为这个查询是针对苹果公司的产品,而非对水果的需求
常见的全文搜索引擎框架
- Lucene
- lucene的开发语言是java , 也是java家族中最出名的一个开源搜索引擎 , 在java世界中已经是标准的全文搜索程序 , 它提供了完整的查询引擎和索引引擎 , 没有中文分词引擎 , 需要自己去实现 , 因此Lucene去做一个搜索引擎需要自己去架构 , 另外他不支持实时搜索 , 但linkedlin和twitter有分别对Lucene改进的实时搜索 ,其中Lucene有一个c++移植版叫CLucene ,CLucene 因为使用编写 , 所以理论上要比Lucene要快
- 官方主页 : Apache Lucene - Welcome to Apache Lucene
- Sphinx
- Sphinx是一个用C++语言写的开源搜索引擎,也是现在比较主流的搜索引擎之一,在建立索引的事件方面比Lucene快50%,但是索引文件比 Lucene要大一倍,因此Sphinx在索引的建立方面是空间换取事件的策略,在检索速度上,和lucene相差不大,但检索精准度方面Lucene要优于Sphinx,另外在加入中文分词引擎难度方面,Lucene要优于Sphinx.其中Sphinx支持实时搜索,使用起来比较简单方便.
- 官方网页 : About | SphinxAbout | Sphinx About | Sphinx
- Xapian
Xapian是一个用C++编写的全文检索程序,它的api和检索原理和lucene在很多方面都很相似,算是填补了lucene在C++中的一个空缺.
官方主页:The Xapian Project
Nutch
Nutch是一个用java实现的开源的web搜索引擎,包括爬虫crawler,索引引擎,查询引擎. 其中Nutch是基于Lucene的,Lucene为Nutch提供了文本索引和搜索的API.
对于应该使用Lucene还是使用Nutch,应该是如果你不需要抓取数据的话,应该使用Lucene,最常见的应用是:你有数据源,需要为这些数据提供一个搜索页面,在这种情况下,最好的方式是直接从数据库中取出数据,并用Lucene API建立索引.
官网 : Apache Nutch™
DataparkSearch
DataparkSearch是一个用C语言实现的开源的搜索引擎. 其中网页排序是采用神经网络模型. 其中支持HTTP,HTTPS,FTP,NNTP等下载网页.包括索引引擎,检索引擎和中文分词引擎(这个也是唯一的一个开源的搜索引擎里有中文分词引擎).能个性化定制搜索结果,拥有完整的日志记录.
官网 : DataparkSearch Engine - an open source search engine
Zettair
Zettair是根据Justin Zobel的研究成果为基础的全文检索实验系统.它是用C语言实现的. 其中Justin Zobel在全文检索领域很有名气,是业界第一个系统提出倒排序索引差分压缩算法的人,倒排列表的压缩大大提高了检索和加载的性能,同时空间膨胀率也缩小到相当优秀的水平. 由于Zettair是源于学术界,代码是由RMIT University的搜索引擎组织写的,因此它的代码简洁精炼,算法高效,是学习倒排索引经典算法的非常好的实例. 其中支持linux,windows,mac os等系统.
官网 : Zettair Homepage
Indri
Indri是一个用C语言和C++语言写的全文检索引擎系统,是由University of Massachusetts和Carnegie Mellon University合作推出的一个开源项目. 特点是跨平台,API接口支持Java,PHP,C++.
官网 : http://www.lemurproject.org/indri/
Terrier
Terrier是由School of Computing Science,Universityof Glasgow用java开发的一个全文检索系统.
官网 : http://terrier.org/
Galago
Galago是一个用java语言写的关于文本搜索的工具集. 其中包括索引引擎和查询引擎,还包括一个叫TupleFlow的分布式计算框架(和google的MapReduce很像).这个检索系统支持很多Indri查询语言.
官网 : http://www.galagosearch.org/
Zebra
Zebra是一个用C语言实现的检索程序,特点是对大数据的支持,支持EMAIL,XML,MARC等格式的数据.
官网 : https://www.indexdata.com/zebra
Solr
Solr是一个用java开发的独立的企业级搜索应用服务器,它提供了类似于Web-service的API接口,它是基于Lucene的全文检索服务器,也算是Lucene的一个变种,很多一线互联网公司都在使用Solr,也算是一种成熟的解决方案.
官网 : http://lucene.apache.org/solr/
Elasticsearch
Elasticsearch是一个采用java语言开发的 , 基于Lucene构造开发的分布式的搜索引擎 , 设计用于云服务中 , 能够达到实时搜索 , 稳定可靠 , Elasticsearch的数据模型是JSON
官网 :Free and Open Search: The Creators of Elasticsearch, ELK & Kibana | Elastic
Whoosh
Whoosh是一个用纯python写的开源搜索引擎.
官网 : https://bitbucket.org/mchaput/whoosh/wiki/Home
Lucene的简介
Lucene 的开发语言是java , 也是java家族中最为出名的一个开源搜索引擎,在Java世界中已经是标准的全文检索程序,它提供了完整的查询引擎和索引引擎,没有中文分词引擎,需要自己去实现,因此用Lucene去做一个搜素引擎需要自己去架构,另外它不支持实时搜索。但是solr和elasticsearch都是基于Lucene封装。
优点 :
成熟的解决方案 , 有过很多的成功案例 , apache顶级项目 ,正在持续的快速的进步, 庞大而活跃的开发社区 , 大量的开发人员 , 它只是一个类库 , 有足够的定制和优化空间 , 经过简单的定制 , 就可以满足绝大部分的需求 , 经过优化 , 可以支持10亿+的搜索
缺点 :
需要额外的开发工作 , 所有的拓展 , 分布式 ,可靠性等都需要自己实现 , 非实时 , 从建索引到可以搜索中间有一个小时的延时 ,而当前的"近实时"搜索方案的可拓展性有待进一步完善
Apache Solr 的简介
Solr是一个高性能 , 采用java开发 , 利于Lucene的全文搜索服务器 , 文档通过Http利用XML加到一个搜索集合中 , 查询该集合也是通过一个http收到一个XML/JSON响应来实现 , 它的主要特性包括 : 高效 , 灵活的缓存功能 , 垂直搜索功能 , 高亮显示搜索结果 , 通过索引复制类提高可用性 , 提供一套Data Schema来定义字段 ,类型和设置文本分析, 提供基于Web的管理界面等
优点 :
Solr有一个更大 ,更成熟的用户 , 开发和贡献者社区
支持添加多种格式的索引 , 如 : HTML , PDF ,微软Office系列软件格式及JSON , XML , CSV等纯文本格式
Solr本身比较成熟 ,稳定
不考虑索引的同时进行搜索 , 速度更快
缺点 :
建立索引时 ,搜索效率下降 , 实时索引搜索效率不高
ElasticSearch的简介
ElasticSearch是一个基于Lucene构建的开源 , 分布式 ,RESTful搜索引擎 ,设计用于云计算中 , 能够达到实时搜索 , 稳定 , 可靠 , 快速 , 安装方便 ,支持通过HTTP使用Json进行数据索引
优点 :
ElasticSearch是分布式 , 不需要其他组件 ,分发是实时的 , 被叫做 : "Push replication"
ElasticSearch完全支持Apache Lucene的接近实时搜索
处理多租户 , 不需要特殊的配置, 而Solr则需要更多的高级设置
ElasticSearch采用Gatway的概念 , 使得完备份更加简单
各节点组成对等的网络结构 , 某些节点出现故障时会自动分配其他的节点代替其进行工作
缺点 :
还不够自动 , 所有预热API
ElasticSearch的应用场景 :
多条件搜索 , 站内搜索 , 地理位置搜索
定位 :
狭义上的理解 :
专注于搜索的非关系型数据库
类似于mongodb
Elasticsearch安装
安装相关文件下载路径:下载中心 - Elastic 中文社区
本教程使用的Elasticsearch 是 7.10.2
服务端 :
安装 :
步骤1 : 下载Elasticsearch 安装包
步骤2 : 检查Elasticsearch 安装环境
检查是否配置了java环境:
打开cmd命令框,输入: set java_home
步骤3:启动Elasticsearch程序
环境检查后,把压缩包解压后,进入到bin目录运行elasticsearch.bat
步骤4:输入地址,检查
浏览器输入:http://localhost:9200,看到浏览器输出服务器的信息,表示安装成功,可以使用了
客户端 :
本教程使用的客户端有两个: 1>Elasticsearch-head插件 2>kibana
为啥用2个?
原因:
Elasticsearch-head插件 查看Elasticsearch数据非常方便,直接上手,kibana 查看数据相对麻烦
Elasticsearch-head插件 操作Elasticsearch命令非常不友好,跟记事本一样,没有任何代码提示与高亮显示,但是kibana有
综合起来:使用Elasticsearch-head插件 的数据查询 + kibana 命令操作
Elasticsearch-head插件 :
Elasticsearch-head插件 是一个chrome浏览器插件,直接安装离线插件即可
显式效果 :
kibana :
kibana是一个大的组件,安装需要满足几个条件
1>安装路径必须是英文(非中文)
2>安装路径不允许有空格
kibana是一个绿色软件,解压即可,启动时,执行bin/kibana.bat即可
启动成功之后访问路径: http://localhost:5601
IK分词器
将分词安装包复制到Elasticsearch安装目录的plugins文件夹
注意: ik分词器安装完成之后,必须重启Elastsearch才能生效。
Elasticsearch核心概念
注意:Elasticsearch约定一个索引只能有一个类型type,并且类型名固定为(_doc)
索引操作 :
添加 : 无参数构造方式
PUT my_lover
带类型type构造方式
PUT /索引名
{"mappings": {"properties": {字段名: {"type": 字段类型, "analyzer": 分词器类型, "search_analyzer": 分词器类型,...},...}}
}
注意 :
1. 参数不能有大写字母
2. 参数格式格式必须是标准的json格式
查看
命令 :
#看单个
GET /索引名
#看所有
GET _cat/indices
删除
命令 :
#语法:DELETE /索引名
DELETE /my_index
数据类型
text类型 : 当一个字段是要被全文搜索的时候 , 比如Email内容 ,产品描述 , 应该设置为text类型 ,设置成text类型之后 , 字段内容会被分析, 在生成倒排序索引以前 , 字符串会被分析器分成一个一个词项 , text类型的字段不用于排序 , 很少用于聚合
keyword类型 : 适用于索引结构化的字段 ,比如Email地址, 主机名 , 状态码和标签 , 如果字段需要进行过滤 , 排序 , 聚合 , keyword类型的字段只能通过精确值搜索到
数据操作
添加 :
语法1 -指定ID
PUT /索引名/_doc/文档ID
{field1: value1,field2: value2,...
}
语法2-不指定ID
POST /索引名/_doc
{field1: value1,field2: value2,...
}
注意 :
- 不指定指定id默认使用随机字符串 ,同时语法必须使用POST方式
- 当索引/映射不存在时 , 会使用默认设置自动添加
- ES中的数据一般是别的数据库导入的 , 所以文档的id会沿用原数据库中的id
- 操作时 , 如果指定文档id , 并且索引库中已经存在 ,则执行更新操作 ,否则执行添加操作
更新 :
语法1-全量更新
PUT /索引名/_doc/文档ID
{field1: value1,field2: value2,...
}
全量更新就是所有字段更新 , 必须明确指定一个value值 ,否则update之后 , 数据会丢失
语法2-部分更新
POST /索引名/_update/文档id
{"doc":{"要改动字段":"值"}
}
查询 :
#查单个
GET /索引名/_doc/文档ID
#查所有
GET /索引名/_doc/_search
删除 :
DELETE /索引名/类型名/文档ID
注意 : 这里的删除 , 并不是真正意义上的删除 , 仅仅是清空文档内容而已 , 并且标记该文档的状态为删除
全文搜索
全文搜索主要依靠2个语句 : match , multi_match
语法1 - match
GET /索引/_search
{
"query":{"match":{field :value}}
}
match用于单字段全文搜索 , value值会被分词器拆分 ,然后去倒排索引中匹配
语法2-multi_match
GET /索引/——search
{
"query":{"multil_match":{"query":"关键词语","fields":[xxxm,xxx]}}
}
mutil_match用于多字段全文检索 ,value会被分词器拆分 , 然后去倒排索引中匹配
中文分词器
留意观察上面全文搜索结果 ,大家会发现 , 全文搜索出来的效果并没有想象中的那么好 , 关键词基本是一个字一个字去匹配的 , 这是怎么回事呢? 那就涉及到Elasticsearch分词器的概念了
概念 :
Elasticsearch在没有明确指定分词器规则时 , 会使用默认的standard分词器对关键字词语拆分并匹配
默认的分词器规则 : 按照单词切分 , 内容转变为小写 , 去掉标点符号 , 如果遇到中文 , 那就当成一个单词处理(一个字一个字拆分)
#默认分词器:
GET /product/_analyze
{"text":"I am Groot"
}
GET /product/_analyze
{"text":"英特尔酷睿i7处理器"
}
很明显 ,上面的分词无法满足中文的分词 , 那怎么办 ? 使用第三方 : ik中文分词器
分词策略
IK有两种分词策略
1 : ik_max_word 【细粒度分词】
会将文本做最细粒度拆分 , 比如将“中华人民共和国人民大会堂”拆分为“中华人民共和国、中华人民、中华、华人、人民共和国、人民、共和国、大会堂、大会、会堂等词语。
2、ik_smart 【粗粒度分词】
会做最粗粒度拆分 , 比如会将“中华人民共和国人民大会堂”拆分为中华人民共和国、人民大会堂。
GET /product/_analyze
{"text":"I am Groot","analyzer":"ik_smart"
}GET /product/_analyze
{"text":"英特尔酷睿i7处理器","analyzer":"ik_smart"
}GET /product/_analyze
{"text":"英特尔酷睿i7处理器","analyzer":"ik_max_word"
}
分词词库
分词完成之后 , 不禁会想 , IK分词怎么做到将长句拆分成词语的 ? 那输入是淘宝会不会被拆分 , 输入王珊珊会不会被拆分 ?
GET /product/_analyze
{"text":"淘宝","analyzer":"ik_smart"
}GET /product/_analyze
{"text":"王珊珊","analyzer":"ik_max_word"
}
显然 , 淘宝不会被拆分 , 王珊珊则会被拆分 , 因为IK词库中有淘宝 , 而没有王珊珊
打开config/main.dic
查看词库 ,明显没有王珊珊这个词 , 所以就会被拆分 , 只要在词库中添加上王珊珊 ,分词器就会把王珊珊当成一个词语 , 就不会进行拆分 , 只要词库维护的好 , IK自然就好
倒排索引
es添加数据与查询流程
- 当数据添加到es中 , es会根据指定分词器 , 将text类型进行分词 ,得到一系列的词根(词项) , 然后将这些词根保存在一个倒排索引表 , 建立起词根与文档id映射关系
- 当客户端输入搜索关键词之后 , es对这个关键词进行分词操作 , 得到一系列的词根 ,然后使用这些词根跟倒排索引表中词根进行比对 , 一旦配对成功 , 那么词根关联文档就是满足搜索条件文档值
- es根据配置成功率与文档内容通过一些算法 对这些数据进行综合评分 , 根据评分倒序排列 ,然后返回
高亮显示
所谓高亮显示就是输入的关键词和其他的文本内容显示的颜色不一样 , 看起来更有视觉冲击
类似上面这种效果
语法 :
GET /索引/_search
{
"query":{"highlight":{"fiedIds":{"fiedId1":{},"fiedId2":{},......},"pre_tags": 开始标签,"post_tags" 结束标签}}
}
highlight : 表示高亮显示 , 需要在fields中配置那些字段检索到该内容需要高亮显示 , 必须配合match/multi_match一起使用
SpringBoot集成Elasticsearch
相关的CRUD操作
步骤1 : 先创建标准的SpringBoot项目 : es-demo
步骤2 : 导入相关依赖
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.3</version><relativePath/>
</parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>
步骤3: 配置ES
#application.properties
spring.elasticsearch.rest.uris=http://localhost:9200
步骤4 : 编写实体类
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName="product")
public class Product {@Idprivate String id;@Field(analyzer="ik_smart",searchAnalyzer="ik_smart",type = FieldType.Text)private String title;private Integer price;@Field(analyzer="ik_smart",searchAnalyzer="ik_smart",type = FieldType.Text)private String intro;@Field(type=FieldType.Keyword)private String brand;}
步骤5:编写持久层代码
/**
* 1>自定义接口继承ElasticsearchRepository
* 2>明确指定2个泛型:
* 1:当前接口操作实体类: product
* 2:当前接口操作实体类主键类型:String
*
*/
public interface ProductRepository extends ElasticsearchRepository<Product, String>{
}
步骤6:编写Service接口与实现类
public interface IProductService {void save(Product product);void update(Product product);void delete(String id);Product get(String id);List<Product> list();
}
@Service
public class ProductServiceImpl implements IProductService {@Autowiredprivate ProductRepository repository;@Autowiredprivate ElasticsearchRestTemplate template;@Overridepublic void save(Product product) {repository.save(product);}@Overridepublic void update(Product product) {repository.save(product);}@Overridepublic void delete(String id) {repository.deleteById(id);}@Overridepublic Product get(String id) {return repository.findById(id).get();}@Overridepublic List<Product> list() {Iterable<Product> all = repository.findAll();List<Product> p = new ArrayList<>();all.forEach(a->p.add(a));return p;}
}
步骤7:编写测试类
@SpringBootTest
public class ElasticsearchDemoApplicationTests {@Autowiredprivate IProductService productService;@Testpublic void testSave() {Product p = new Product();p.setId("123")p.setBrand("shanshan");p.setIntro("shanshan手机");p.setPrice(1000);p.setTitle("全球最美的手机");productService.save(p);}@Testpublic void testUpate() {Product p = new Product();p.setId("ue5r1m4BXlaPW5P0TegF");p.setBrand("shanshan");p.setIntro("shanshan手机");p.setPrice(1000);p.setTitle("全球最sb的手机");productService.update(p);}@Testpublic void testDelete() {productService.delete("123");}@Testpublic void testGet() {System.out.println(productService.get("123"));}@Testpublic void testList() {System.err.println(productService.list());}
}
全文搜索
步骤1 : 新建类: QueryTest
步骤2: 编写2个全文搜索方法
// 查询商品标题中符合"游戏 手机"的字样的商品
@Test
public void testQuery4(){NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();/*** {* query:{* match:{title:"游戏 手机"}* }* }*/builder.withQuery(QueryBuilders.matchQuery("title", "游戏 手机"));builder.withPageable(PageRequest.of(0, 100));Page<Product> search = repository.search(builder.build());search.getContent().forEach(System.err::println);
}
// 查询商品标题或简介中符合"蓝牙 指纹 双卡"的字样的商品
@Test
public void testQuery7(){NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();/*** {* query:{* multi_match:{* "query":"蓝牙 指纹 双卡",* "fields":["title", "intro"]* }* }* }*/builder.withQuery(QueryBuilders.multiMatchQuery("蓝牙 指纹 双卡", "title", "intro"));builder.withPageable(PageRequest.of(0, 100, Sort.Direction.DESC, "price"));Page<Product> search = repository.search(builder.build());search.getContent().forEach(System.err::println);
}
高亮显示
@Test
public void testHighlight() throws Exception {//定义索引库SearchRequest searchRequest = new SearchRequest("product");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//定义query查询MultiMatchQueryBuilder queryBuilder = QueryBuilders.multiMatchQuery("蓝牙 指纹 双卡","title", "intro");HighlightBuilder highlightBuilder = new HighlightBuilder(); // 生成高亮查询器highlightBuilder.field("title");// 高亮查询字段highlightBuilder.field("intro");// 高亮查询字段highlightBuilder.requireFieldMatch(false); // 如果要多个字段高亮,这项要为falsehighlightBuilder.preTags("<span style='color:red'>"); // 高亮设置highlightBuilder.postTags("</span>");highlightBuilder.fragmentSize(800000); // 最大高亮分片数highlightBuilder.numOfFragments(0); // 从第一个分片获取高亮片段Pageable pageable = PageRequest.of(1, 2); // 设置分页参数NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(queryBuilder) // match查询.withPageable(pageable).withHighlightBuilder(highlightBuilder) // 设置高亮.build();SearchHits<Product> searchHits = template.search(searchQuery, Product.class);List<Product> list = new ArrayList();for (SearchHit<Product> searchHit : searchHits) { // 获取搜索到的数据Product content = searchHit.getContent();// 处理高亮Map<String, List<String>> highlightFields = searchHit.getHighlightFields();for (Map.Entry<String, List<String>> stringHighlightFieldEntry : highlightFields.entrySet()) {String key = stringHighlightFieldEntry.getKey();if (StringUtils.equals(key, "title")) {List<String> fragments = stringHighlightFieldEntry.getValue();StringBuilder sb = new StringBuilder();for (String fragment : fragments) {sb.append(fragment.toString());}content.setTitle(sb.toString());}if (StringUtils.equals(key, "intro")) {List<String> fragments = stringHighlightFieldEntry.getValue();StringBuilder sb = new StringBuilder();for (String fragment : fragments) {sb.append(fragment.toString());}content.setIntro(sb.toString());}}list.add(content);}Page page = new PageImpl(list, pageable, searchHits.getTotalHits());list.forEach(System.out::println);
}
Elasticsearch的详细讲解相关推荐
- ElasticSearch搜索详细讲解与操作
全文检索基础 全文检索流程 流程: #mermaid-svg-7Eg2qFEl06PIEAxZ {font-family:"trebuchet ms",verdana,arial, ...
- 【云原生】Docker仓库详细讲解,搭建使用 Docker Registry 私服
前言 大家好,本文是对 Docker 仓库的详细讲解,讲解了如何使用官方仓库,在官方仓库搜寻镜像,以及搭建 Docker Registry 私服.希望对大家有所帮助~ 目录 前言 一.访问 Docke ...
- 适合新手练手,用Python爬取OPGG里英雄联盟英雄胜率及选取率,详细讲解加注释(建议收藏练手)
今天来个简单的小项目,适合新手拿来练手,在OPGG上爬取英雄联盟里的法师,ADC,打野,辅助所有英雄的胜率及选取率,是不是感觉很高大上,但是却很简单,只要用三十多行代码就能实现,详细讲解每一行代码加注 ...
- Python的零基础超详细讲解(第十三天)-Python的类与对象
基础篇往期文章如下: Python的零基础超详细讲解(第一天)-Python简介以及下载 Python的零基础超详细讲解(第二天)-Python的基础语法1 Python的零基础超详细讲解(第三天)- ...
- Python的零基础超详细讲解(第十二天)-Python函数及使用
基础篇往期文章: Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博 ...
- Python的零基础超详细讲解(第七天)-Python的数据的应用
往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...
- Python的零基础超详细讲解(第五天)-Python的运算符
往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...
- java异常详细讲解_Java异常处理机制的详细讲解和使用技巧
一起学习 1. 异常机制 1.1 异常机制是指当程序出现错误后,程序如何处理.具体来说,异常机制提供了程序退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器. 1.2 ...
- 未来网络发展的趋势——IPv6详细讲解与基本配置
实验目的: 1. 掌握IPv6的基本工作原理: 2. 区别IPv6和IPv4有什么区别: 3. 掌握IPv6的一些新的特征: 4. 掌握IPv6的发展进程和部署情况: 实验拓扑: 实验步骤: 一. ...
最新文章
- 使用pdf.js预览实现读取服务器外部文件
- Luogu P1654 OSU! | 期望
- 【深度学习】基于区域生长的图像分割算法!
- postgresql-9.2beta2 安装相关
- 微软出品,文科生也能学得懂的Python免费入门视频
- 部署hexo后github pages页面未更新或无法打开问题
- java服务端验证框架_SpringBoot服务端数据校验过程详解
- Atitit 架构的艺术 目录 1. 按照技术站分类	1 1.1. LAMP架构,到IOE架构,再到分布式架构	1 1.2. Ssh ssm	1 2. Bs cs web hybrid架构	1 3.
- Tomcat8安装(或卸载重装)
- 浅谈融云即时通讯服务「日志优化」
- iptables实现网卡包的转发
- 数字谐音记忆编码连连看网页应用
- 用qpython3写一个发送短信的程序
- 科普一下bl锁的知识,没解锁的必看!
- 【开发】后端框架——Mybatis
- powershell牛逼啊.
- 浪潮信息助力医院智慧医疗建设走得既稳又快
- 在沙箱中IE不能上网的解决方法
- java轻量级框架_轻量级的Java 开发框架 Spring
- python 进程生命周期_计算客户生命周期价值的python解决方案
热门文章
- 智能蓝牙挂锁方案开发
- word2019快速生成目录的方法
- 笔记本外接显示器后没有声音 (windows 10)
- BCGControlBarPro 31.2 零售源码版
- 机器人“湘军”在路上
- 一边没辞职另一边入职_我从事业单位辞职,再重新考事业单位的经历~
- Prompt learning 教学[进阶篇]:简介Prompt框架并给出自然语言处理技术:Few-Shot Prompting、Self-Consistency等;项目实战搭建知识库内容机器人
- Java实现语音播报
- oracle flashback on,Oracle Flashback database
- openGauss数据库的使用