Elasticsearch之Nested Sorting

(这是一个小系列:请戳:Elasticsearch之Nested(嵌套)系列,查看其他nested相关文章)

It is possible to sort by the value of a nested field, even though the value exists in a separate nested document. To make the result

more interesting, we will add another record:

尽管存在于独立的nested文本内,基于nested字段的值排序还是可行的。为了让结果更有意思,让我们增加其他的记录:

curl -XPUT 'localhost:9200/my_index/blog/2' -d '
{
  "title": "Investment secrets",
  "body":  "What they don't tell you ...",
  "tags":  [ "shares", "equities" ],
  "comments": [
    {
      "name":    "Mary Brown",
      "comment": "Lies, lies, lies",
      "age":     42,
      "stars":   1,
      "date":    "2014-10-18"
    },
    {
      "name":    "John Smith",
      "comment": "You're making it up!",
      "age":     28,
      "stars":   2,
      "date":    "2014-10-16"
    }
  ]
}

Imagine that we want to retrieve blog posts that received comments in October, ordered by the lowest number of stars that each blog

post received. The search request would look like this:

设想我们想要检索在10月份被评论的博客文章,同时按每篇文章收到的最低星级排序。检索请求应该类似如下:

curl -XPUT 'localhost:9200/_search' -d '
{
  "query":{
     "nested":{
	    "path":"comments",
		"filter":{
		   "range":{
		      "comments.date":{
			      "gte":"2014-10-01",
				  "lt":"2014-11-01"
			  }
		   }
		}
	 }
  },
  "sort":{
     "comments.stars":{
	     "order":"asc",
		 "mode": "min",
		 "nested_filter":{
		     "range":{
			    "comments.date":{
				   "gte":"2014-10-01",
				   "lt":"2014-11-01"
				}
			 }
		 }
	 }
  }
}

Why do we need to repeat the query conditions in the nested_filter? The reason is that sorting happens after the query has been executed.

The query matches blog posts that received comments in October, but it returns blog post documents as the result. If we didn’t include the

nested_filter clause, we would end up sorting based on any comments that the blog post has ever received, not just those received in October.

为什么我们要在nested_filter内重复查询条件?原因是排序发生在查询执行结束后。查询匹配10月收到评论的博客文章,但是它返回博客文章

文本作为结果。如果我们不包括nested_filter语块,那么最终会基于返回的博客文章的所有评论进行排序,而不是在10月份收到的评分。

(!!!根据自己有限的elasticsearch使用经验,这点非常值得各位读者重视!!!)

原文:http://www.elastic.co/guide/en/elasticsearch/guide/current/nested-sorting.html

时间: 2024-11-05 12:30:23

Elasticsearch之Nested Sorting的相关文章

Elasticsearch之Nested(嵌套)系列

工作需要,专门花了一下午研究了Elasticsearch里面的nested.最好的材料还是官网上面的Elasticsearch: The Definitive Guide, 所以直接将里面涉及到nested的文章找来看了看,顺便把它们翻译了,贴出来和大家分享.同时综合考虑了一下,把英语大体的 英文原文也一起贴出来了.希望这样能够适应不同读者的口味. 文章都顺手翻译了,每天贴出来一篇吧. 1.Elasticsearch之Nested Object 2.Elasticsearch之Nested Ob

Elasticsearch之Nested Aggregation

(这是一个小系列:请戳:Elasticsearch之Nested(嵌套)系列,查看其他nested相关文章) In the same way as we need to use the special nested query to gain access to nested objects at search time, the dedicated nested aggregation allows us to aggregate fields in nested objects: 与在检索时

Elasticsearch之Nested Object

Given the fact that creating, deleting, and updating a single document in Elasticsearch is atomic, it makes sense to store closely related entities within the same document. 考虑到在ES里面建立,删除和更新一个单一文本是原子性的,那么将相关实体保存在同一个文本里面是有意义的. PUT /my_index/blogpost/1

Elasticsearch之Nested Object Mapping

Setting up a nested field is simple-where you would normally specify type object, make it type nested instead: 创建一个nested 字段很简单--只要在你通常指定object类型的地方,改成nested类型就行: curl -XPUT 'localhost:9200/my_index' -d ' { "mappings":{ "blogpost":{ &q

elasticsearch按照配置时遇到的一些坑 [Failed to load settings from [elasticsearch.yml]]

这里整理几个空格引起的问题. 版本是elasticsearch-2.3.0 或者elasticsearch-rtf-master Exception in thread "main" SettingsException[Failed to load settings from [elasticsearch.yml]]; nested: ElasticsearchParseException[malformed, expected settings to start with 'obje

排序与相关性(Sorting and Relevance)

本文翻译自Elasticsearch官方指南的Sorting and Relevance一章的第一节. 原文地址:http://www.elastic.co/guide/en/elasticsearch/guide/current/_sorting.html 排序 ES默认是通过相关度来对结果进行排序的,最相关的文档在最前面.在本章里,我们阐述我们所说的相关性以及它是如何计算的,但是我们先讲解sort参数及其如何使用. 为了根据相关性进行排序,我们需要把相关性表示为一个值.在Elasticsea

总结遇到的elasticsearch启动失败的几种情况及解决

1.使用root用户启动失败 在有一次搭建elasticsearch的时候,使用systemctl启动elasticsearch失败,然后在bin目录下面去使用启动脚本启动,发现报错不能用root用户启动,报"Caused by: java.lang.RuntimeException: can not run elasticsearch as root": [[email protected] bin]# ./elasticsearch [2017-12-20T17:01:47,922

ElasticSearch本人启动报错总结

1.报错关键代码如下: Exception in thread "main" 2019-04-28 03:53:04,339 main ERROR No log4j2 configuration file found. SettingsException[Failed to load settings from [elasticsearch.yml]]; nested: ParsingException[Failed to parse object: expecting token o

字段(field)数据类型

基本类型 1. 字符串 字符串类型被分为两种情况:full-text 和 keywords. full-text 表示字段内容会被分析,而 keywords 表示字段值只能作为一个精确值查询. 参数: analyzer.boost.doc_values.fielddata.fields.ignore_above.include_in_all.index.index_options.norms.null_value.position_increment_gap.store.search_analy