Как бороться с агрегациями (по группам) вasticsearch - PullRequest
0 голосов
/ 29 апреля 2019

Я перехожу с SQL наasticsearch, но я столкнулся с некоторыми проблемами с агрегациями, особенно group by

мой запрос выглядит как

SELECT    count(*) as total,country_code 
FROM      orders 
WHERE     product_id = ? 
GROUP BY  country_code 
ORDER BY  total desc LIMIT 3 

SQLРЕЗУЛЬТАТ

Я пробовал этот, но не работает

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "line_items.product_id": {
                            "query": "0001112223333"
                        }
                    }
                }
            ]
        }
    },
    "from": 0,
    "size": 3,
    "aggregations": {
        "country_code": {
            "aggregations": {
                "COUNT(*)": {
                    "value_count": {
                        "field": "_index"
                    }
                }
            },
            "terms": {
                "field": "country_code",
                "size": 200
            }
        }
    }
}

ES RESULT

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Вам следует рассмотреть возможность использования идентификатора продукта в качестве ключевого слова, а не текстового типа, а затем использовать запрос термина вместо запроса соответствия, поскольку это будет намного более эффективным.Кроме того, поскольку вам не нужны никакие данные из документов, вы можете установить для запроса размер 0.

Кроме того, вы должны использовать тип ключевого слова в отображении для поля country_code.

Этот простой запрос должен выполнить вашу работу -

{
  "size": 0,
  "query": {
    "term": {
      "line_items.product_id": 1116463
    }
  },
  "aggregations": {
    "ad_type": {
      "terms": {
        "field": "country_code",
        "size": 200
      }
    }
  }
}

PS - также поделитесь отображением индекса, так как это сделает изображение немного более четким.

0 голосов
/ 29 апреля 2019

На основе ваших изображений используйте тип данных keyword, а не text.

Согласно ссылке для ключевого слова,

Они обычно используются для фильтрации (найдите все сообщения в блоге, где публикуется статус), для сортировки и агрегации.Поля ключевых слов доступны для поиска только по их точному значению.

Причина, по которой вы наблюдаете эти ошибки, заключается в том, что вы пытаетесь выполнить агрегирующий запрос для text типа данных.Тип данных text проходит фазу Analysis , где ES принимает значение, разбивает его на токены и сохраняет их в инвертированном индексе,

Я бы предложил вам использовать multi-поля где ваше отображение для country_code будет таким, как показано ниже:

Отображение:

{  
   "properties":{  
      "country_code":{  
         "type":"text",
         "fields":{  
            "keyword":{  
               "type":"keyword"
            }
         }
      }
   }
}

Запрос агрегации:

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "line_items.product_id": {
                            "query": "0001112223333"
                        }
                    }
                }
            ]
        }
    },
    "from": 0,
    "size": 3,
    "aggregations": {
        "country_code": {
            "aggregations": {
                "COUNT(*)": {
                    "value_count": {
                        "field": "_index"
                    }
                }
            },
            "terms": { 
                "field": "country_code.keyword",          <----- change this
                "size": 200
            }
        }
    }
}

Обратите внимание на поле вышегде я использовал country_code.keyword в своем запросе агрегации.

Надеюсь, это поможет!

...