簡體   English   中英

Elasticsearch 6.2.4:如何通過_score排序聚合結果?

[英]Elasticsearch 6.2.4: how to order aggregation results by _score?

我在按_score desc排序的查詢部分中有所需的查詢結果。 現在,我需要提取每個文檔的3個字段。 我想實現像:

select distinct field1, field2, field3 from table A;

我只是試過:

1)使用折疊刪除重復的值

GET index/_search
{
  "collapse" : {
        "field" : "filed1.keyword" 
    }
  ...
}

但是問題在於它只會保留filed1的不同值,而忽略field2和fiel3的值。 例如,我們有2條記錄,例如:

[1, "a", "b"], [1, "c", "d"] 

使用這種方法,我們只能獲得一條記錄,因為它們具有相同的field1值。 我想要這三個字段的不同組合值。 我們可以使用inner_hits來獲取第二個字段的distict值,但是根據https://www.elastic.co/guide/zh-CN/elasticsearch/reference/current/search-request-collapse.html :第二級折疊不會不允許inner_hits。 這意味着它不能用於獲取多個字段(> 2)之間的區別值。

2)使用聚合:

GET index/_search
{
  "aggs": {
    "field1": {
      "terms": {
        "field": "field1.keyword"
      },
      "aggs": {
        "field2": {
          "terms": {
            "field": field2.keyword",
            "missing": ""
          },
          "aggs": {
            "field3": {
              "terms": {
                "field": "field3.keyword",
                "missing": ""
              }
            }
          }
        }
      }
    }
  },
  ...
}

它返回[field1,field2,field3]的離散值,但是文檔的順序已更改。 它們是由doc_count排序的,而不是_score排序的,我們無法在結果中獲取_score的信息。

那么,如何在不更改當前順序的情況下獲得不同的組合值(因為我們已在“查詢”部分中自定義了文檔順序)? 或者我們如何通過_score排序聚合結果?

謝謝!

以下是如何使用_score aggregations示例查詢。

POST <your_index_name>/_search
{
  "query": {
    "match": {
      "<yourfield>": "<yourquery>"
    }
  },
  "aggs": {
    "myaggs": {
      "terms": {
        "script": "_score"
      }
    }
  }
}

因此,您上面的匯總查詢將采用以下形式:

POST <your_index_name>/_search
{  
   "size":0,
   "query":{  
      "match":{  
         "field1": "search non-search"
      }
   },
   "aggs":{  
      "myaggs":{  
         "terms":{  
            "field":"field1.keyword",
            "order": {
              "_term": "asc"
            }
         },
         "aggs":{  
            "myotheraggs":{  
               "terms":{  
                  "field":"field2.keyword",
                  "order": {
                    "_term": "asc"
                  }
               },
               "aggs":{  
                  "myotheraggs2":{  
                     "terms":{  
                       "field":"field3.keyword",
                       "order": {
                          "_term": "asc"
                       }
                     },
                     "aggs":{  
                        "myscoreaggs":{  
                           "terms":{  
                              "script":"_score",
                              "order": {
                                  "_term": "desc"
                              }
                           }
                        }
                     }
                  }
               }
            }
         }
      }

   }
}

因此,基本上,以上查詢將按field1 field2 field3 score的順序返回您,其中field1 field2 field3將根據asc lexicographical順序進行排序,而_score則按desc順序進行排序

例如,下面是樣本排序數據的樣子

field1|field2|field3|score
--------------------------------
non-search|lucene|graphdb|1
search|lucene|elasticsearch|2
search|lucene|elasticsearch|1
search|lucene|solr|2
search|lucene|solr|1

更新的答案帖子聊天

POST someindex/_search
{  
   "size":0,
   "aggs":{  
      "myagg":{  
         "terms":{  
            "script":{  
               "source":"doc['field1'].value + params.param + doc['field2'].value + params.param + doc['field3'].value",
               "lang":"painless",
               "params":{  
                  "param":", "
               }
            },
            "order":{  
               "_term":"asc"
            }
         }
      }
   }
}

讓我知道是否有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM