Elasticsearch 6.2.4: как упорядочить результаты агрегации по _score? - PullRequest
0 голосов
/ 29 октября 2018

Я получил требуемые результаты запроса в части запроса, упорядоченной по _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/en/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?

Спасибо!

1 Ответ

0 голосов
/ 29 октября 2018

Ниже приведен пример запроса о том, как вы используете aggregations для _score.

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"
            }
         }
      }
   }
}

Дайте мне знать, если это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...