使用阿里云试用Elasticsearch学习,1.6 基础入门——排序与相关性,阿里云Elasticsearch试用教程,入门基础——排序与相关性学习指南

马肤

温馨提示:这篇文章已超过463天没有更新,请注意相关的内容是否还可用!

摘要:,,本文介绍了使用阿里云试用Elasticsearch的学习过程,重点介绍了Elasticsearch 1.6版本的基础入门知识。文章详细阐述了如何在Elasticsearch中进行排序和相关性操作,帮助初学者快速掌握Elasticsearch的基本操作和应用。通过本文的学习,读者可以更好地理解Elasticsearch的排序和相关性功能,为后续的深入学习和应用打下坚实基础。

默认情况下,搜索结果按照相关性进行排序,最相关的文档会排在最前面,在本章的后面部分,我们会解释相关性的含义以及如何计算,不过在此之前,让我们先了解一下sort参数以及如何使用它。

使用阿里云试用Elasticsearch学习,1.6 基础入门——排序与相关性,阿里云Elasticsearch试用教程,入门基础——排序与相关性学习指南 第1张

(插入图片)

排序

为了按照相关性来排序,需要将相关性表示为一个数值,在Elasticsearch中,相关性得分由一个浮点数表示,并在搜索结果中通过_score参数返回,默认排序是_score降序。

有时,相关性评分对你来说并没有意义,下面的查询返回所有user_id字段包含1的结果:

(插入图片)

在这个案例中,没有一个有意义的分数:因为我们使用的是filter(过滤),这表明我们只希望获取匹配user_id: 1的文档,并没有试图确定这些文档的相关性,实际上文档将按照随机顺序返回,并且每个文档的得分都是零分。

如果评分为零对你造成了困扰,你可以使用constant_score查询进行替代:

这将让所有文档应用一个恒定分数(默认为1),它将执行与前述查询相同的查询,并且所有的文档将像之前一样随机返回,这些文档只是有了一个分数而不是零分。

按字段的值排序

在这个案例中,通过时间来对tweets进行排序是有意义的,最新的tweets排在最前,我们可以使用sort参数进行实现:

你会注意到结果中的两个不同点:

_score不被计算,因为它并没有用于排序。

date字段的值表示为自epoch (January 1, 1970 00:00:00 UTC)以来的毫秒数,通过sort字段的值返回。

我们在每个结果中有一个新的名为sort的元素,它包含了我们用于排序的值,在这个案例中,我们按照date进行排序,在内部被索引为自epoch以来的毫秒数,long类型数1411516800000等价于日期字符串"2014-09-24 00:00:00 UTC"。

使用阿里云试用Elasticsearch学习,1.6 基础入门——排序与相关性,阿里云Elasticsearch试用教程,入门基础——排序与相关性学习指南 第2张

_score和max_score字段都是null,计算_score的花销巨大,通常仅用于排序;我们并不根据相关性排序,所以记录_score是没有意义的,如果你无论如何都要计算_score,你可以将track_scores参数设置为true。

一个简便方法是,你可以指定一个字段用来排序:"sort": "number_of_children",字段将会默认升序排序,而按照_score的值进行降序排序。

多级排序

假定我们想要结合使用date和_score进行查询,并且匹配的结果首先按照日期排序,然后按照相关性排序:

排序条件的顺序是很重要的,结果首先按第一个条件排序,仅当结果集的第一个sort值完全相同时才会按照第二个条件进行排序,以此类推。

多级排序并不一定包含_score,你可以根据一些不同的字段进行排序,如地理距离或是脚本计算的特定值。

Query-string搜索也支持自定义排序,可以在查询字符串中使用sort参数:GET /_search?sort=date:desc&sort=_score&q=search

多值字段的排序

一种情形是字段有多个值的排序,这些值并没有固有的顺序;一个多值的字段仅仅是多个值的包装,这时应该选择哪个进行排序呢?

对于数字或日期,你可以将多值字段减为单值,这可以通过使用min、max、avg或是sum排序模式,例如你可以按照每个date字段中的最早日期进行排序:

字符串排序与多字段

被解析的字符串字段也是多值字段,但是很少会按照你想要的方式进行排序,如果你想分析一个字符串,如"fine old art",这包含3项,我们很可能想要按第一项的字母顺序排序,然后按第二项的字母顺序排序,等等,但是Elasticsearch在排序过程中没有这样的信息。

你可以使用min和max排序模式(默认是min),但是这会导致排序以"art"或是"old",任何一个都不是所希望的,但是保存相同的字符串两次在_source字段是浪费空间的,我们真正想要做的是传递一个单字段但是用两种方式索引它,所有的_core_field类型(strings, numbers, Booleans, dates)接收一个fields参数,该参数允许你转化一个简单的映射如:将tweet字段转化为一个既包含全文字本分析又包含keyword类型的子字段,这样我们就可以重新索引我们的数据来使用tweet字段进行搜索和tweet.raw字段进行排序: 接下来我们来讨论一下相关性的概念及其计算方式。 相关性及其计算方式 我们曾经讲过搜索结果默认是按照相关性倒序排列的,那么什么是相关性?如何计算呢? 每个文档都有一个相关性评分,用一个正浮点数字段_score来表示,_score的评分越高,相关性越高。 查询语句会为每个文档生成一个_score字段,评分的计算方式取决于查询类型不同的查询语句用于不同的目的:fuzzy查询会计算与关键词的拼写相似程度;terms查询


0
收藏0
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

相关阅读

  • 【研发日记】Matlab/Simulink自动生成代码(二)——五种选择结构实现方法,Matlab/Simulink自动生成代码的五种选择结构实现方法(二),Matlab/Simulink自动生成代码的五种选择结构实现方法详解(二)
  • 超级好用的C++实用库之跨平台实用方法,跨平台实用方法的C++实用库超好用指南,C++跨平台实用库使用指南,超好用实用方法集合,C++跨平台实用库超好用指南,方法与技巧集合
  • 【动态规划】斐波那契数列模型(C++),斐波那契数列模型(C++实现与动态规划解析),斐波那契数列模型解析与C++实现(动态规划)
  • 【C++】,string类底层的模拟实现,C++中string类的模拟底层实现探究
  • uniapp 小程序实现微信授权登录(前端和后端),Uniapp小程序实现微信授权登录全流程(前端后端全攻略),Uniapp小程序微信授权登录全流程攻略,前端后端全指南
  • Vue脚手架的安装(保姆级教程),Vue脚手架保姆级安装教程,Vue脚手架保姆级安装指南,Vue脚手架保姆级安装指南,从零开始教你如何安装Vue脚手架
  • 如何在树莓派 Raspberry Pi中本地部署一个web站点并实现无公网IP远程访问,树莓派上本地部署Web站点及无公网IP远程访问指南,树莓派部署Web站点及无公网IP远程访问指南,本地部署与远程访问实践,树莓派部署Web站点及无公网IP远程访问实践指南,树莓派部署Web站点及无公网IP远程访问实践指南,本地部署与远程访问详解,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南。
  • vue2技术栈实现AI问答机器人功能(流式与非流式两种接口方法),Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法探究,Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法详解
  • 发表评论

    快捷回复:表情:
    评论列表 (暂无评论,0人围观)

    还没有评论,来说两句吧...

    目录[+]

    取消
    微信二维码
    微信二维码
    支付宝二维码