温馨提示:这篇文章已超过463天没有更新,请注意相关的内容是否还可用!
摘要:,,本文介绍了使用阿里云试用Elasticsearch的学习过程,重点介绍了Elasticsearch 1.6版本的基础入门知识。文章详细阐述了如何在Elasticsearch中进行排序和相关性操作,帮助初学者快速掌握Elasticsearch的基本操作和应用。通过本文的学习,读者可以更好地理解Elasticsearch的排序和相关性功能,为后续的深入学习和应用打下坚实基础。
默认情况下,搜索结果按照相关性进行排序,最相关的文档会排在最前面,在本章的后面部分,我们会解释相关性的含义以及如何计算,不过在此之前,让我们先了解一下sort参数以及如何使用它。
(插入图片)
排序
为了按照相关性来排序,需要将相关性表示为一个数值,在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"。
_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查询
还没有评论,来说两句吧...