Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。
RestHighLevelClient 底层封装的是一个http连接池,当需要执行 update、index、delete操作时,直接从连接池中取出一个连接,然后发送http请求到ElasticSearch服务端,服务端基于Netty接收请求。
新版本的elasticsearch java client 都推荐用RestHighLevelClient去连接ES集群,放弃掉之前的transport client的方式。
注:spring boot工程
如mapper类,service类就自己去创建。
mapping是对索引库中文档的约束,常见的mapping属性包括:
请求方式:PUT
请求路径:/索引库名,可以自定义
请求参数:mapping映射
测试结果
请求方式:GET
请求路径:/索引库名
请求参数:无
测试结果
测试结果
索引库一旦创建,无法修改mapping。
虽然无法修改mapping中已有的字段,但是却允许添加新的字段到mapping中,因为不会对倒排索引产生影响。
请求方式:PUT
请求路径:/索引库名/_mapping
请求参数:mapping映射
测试结果
请求方式:DELETE
请求路径:/索引库名
请求参数:无
请求方式:POST
请求路径:/索引库名/_doc/文档id
请求参数:Json
测试结果
测试结果
请求方式:GET
请求路径:/索引库名/_doc/文档id
请求参数:无
测试结果
测试结果
全量修改是覆盖原来的文档,其本质是:
注意:如果根据id删除时,id不存在,第二步的新增也会执行,也就从修改变成了新增操作了。
请求方式:PUT
请求路径:/{索引库名}/_doc/文档id
请求参数:Json
测试结果
查询文档,结果已经覆盖
测试结果
增量修改是只修改指定id匹配的文档中的部分字段。
请求方式:POST
请求路径:/{索引库名}/_update/文档id
请求参数:json
测试结果
查询文档
请求方式:DELETE
请求路径:/{索引库名}/_doc/id值
请求参数:无
测试结果
测试结果
Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括:
查询所有:查询出所有数据
全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配
精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段
地理(geo)查询:根据经纬度查询
复合(compound)查询:复合查询可以将上述各种查询条件组合起来,合并查询条件
查询的语法基本一致:
请求方式:GET
请求路径:/{索引库名}/_search
请求参数:json
测试结果
测试结果
全文检索查询的基本流程如下:
比较常用的场景包括:
商城的输入框搜索
百度输入框搜索
match查询:单字段查询
multi_match查询:多字段查询,任意一个字段符合条件就算符合查询条件,参与查询字段越多,查询性能越差
测试结果
测试结果
测试结果
测试结果
可以看到,两种查询结果是一样的,是因为mapping映射中我们将brand、name、business值都利用copy_to复制到了all字段中。因此你根据三个字段搜索,和根据all字段搜索效果当然一样了。
但是,搜索字段越多,对查询性能影响越大,因此建议采用copy_to,然后单字段查询的方式。
精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词
term单值
测试结果
terms
测试结果
term多字段
测试结果
term单值
terms多值
term多字段
矩形范围查询,也就是geo_bounding_box查询,查询坐标落在某个矩形范围的所有文档:
查询时,需要指定矩形的左上、右下两个点的坐标,然后画出一个矩形,落在该矩形内的都是符合条件的点。
附近查询,也叫做距离查询(geo_distance):查询到指定中心点小于某个距离值的所有文档
换句话来说,在地图上找一个点作为圆心,以指定距离为半径,画一个圆,落在圆内的坐标都算符合条件:
多边形查询(geo_polygon),以多个点,确定多边形,获取多边形内的全部数据,与矩形相似,只不过是多个点
测试结果
测试结果
测试结果
复合(compound)查询:复合查询可以将其它简单查询组合起来,实现更复杂的搜索逻辑。常见的有两种:
当我们利用match查询时,文档结果会根据与搜索词条的关联度打分(_score),返回结果时按照分值降序排列。
TF-IDF算法
TF-IDF算法有一各缺陷,就是词条频率越高,文档得分也会越高,单个词条对文档影响较大
BM25算法,elasticsearch5.1版本后采用的算法
BM25则会让单个词条的算分有一个上限,曲线更加平滑
根据相关度打分是比较合理的需求,但合理的不一定是产品经理需要的。
以百度为例,你搜索的结果中,并不是相关度越高排名越靠前,而是谁掏的钱多排名就越靠前.
要想认为控制相关性算分,就需要利用elasticsearch中的function score 查询了。
function score 查询中包含四部分内容:
function score的运行流程如下:
因此,其中的关键点是:
过滤条件:决定哪些文档的算分被修改
算分函数:决定函数算分的算法
运算模式:决定最终算分结果
测试结果
布尔查询是一个或多个查询子句的组合,每一个子句就是一个子查询。子查询的组合方式有:
需要注意的是,搜索时,参与打分的字段越多,查询的性能也越差。因此这种多条件查询时,建议这样做:
测试结果
elasticsearch默认是根据相关度算分(_score)来排序,但是也支持自定义方式对搜索结果排序。可以排序字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等。
keyword、数值、日期类型排序的语法基本一致。
测试结果
测试结果
elasticsearch 默认情况下只返回top10的数据。而如果要查询更多数据就需要修改分页参数了。elasticsearch中通过修改from、size参数来控制要返回的分页结果:
测试结果
高亮显示的实现分为两步:
注意:
测试结果
测试结果
**聚合(aggregations)**可以让我们极其方便的实现对数据的统计、分析、运算。例如:
实现这些统计功能的比数据库的sql要方便的多,而且查询速度非常快,可以实现近实时搜索效果。
聚合常见的有三类:
**桶(Bucket)**聚合:用来对文档做分组
**度量(Metric)**聚合:用以计算一些值,比如:最大值、最小值、平均值等
**管道(pipeline)**聚合:其它聚合的结果为基础做聚合
**注意:**参加聚合的字段必须是keyword、日期、数值、布尔类型
继承关系图
参数
测试结果
测试结果
本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕,E-mail:xinmeigg88@163.com
本文链接:http://www.ksxb.net/tnews/1795.html