1. 程式人生 > >Elasticsearch之Nested Sorting

Elasticsearch之Nested Sorting

                                                    

         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