Elasticsearch Aggs фильтр с условием - PullRequest
0 голосов
/ 24 января 2020

Elasticsearch v 7.5

Привет и хорошего дня!

У меня есть индекс с именем Articles , и он имеет следующий пример содержимого:

{
    "_id" : 1,
    "title" : "Title 1"
    "cms" : [
        {
          "cli_id" : 0,
          "cmx_sentiment" : "Negative"
        },
        {
          "cli_id" : 4599,
          "cmx_sentiment" : "Positive"
        }
    ]
},
{
    "_id" : 2,
    "title" : "Title 2"
    "cms" : [
        {
          "cli_id" : 0,
          "cmx_sentiment" : "Positive"
        }
    ]
},
{
    "_id" : 3,
    "title" : "Title 3"
    "cms" : [
        {
          "cli_id" : 0,
          "cmx_sentiment" : "Neutral"
        }
    ]
},
{
    "_id" : 4,
    "title" : "Title 4"
    "cms" : [
        {
          "cli_id" : 0,
          "cmx_sentiment" : "Positive"
        },
        {
          "cli_id" : 12,
          "cmx_sentiment" : "Negative"
        }
    ]
}

Я хочу создать ES-запрос с aggs для отображения cms.cmx_sentiment для отчета, но с условием

У меня есть этот скелетный запрос:

GET socialmedia/_search
{
  "size" : 1,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "CMS": {
      "nested": {
        "path": "cms"
      }
    }
  }
}

это вывод:

"aggregations" : {
    "CMS" : {
      "doc_count" : 6
    }
  }

doc_count равно 6, потому что

  • артикул 1 имеет 2 cms вложенных элемента
  • статья 2 имеет 1 вложенный элемент
  • статья 3 имеет 1 вложенный элемент и
  • статья 4 имеет 2 вложенных элемента

Теперь я хочу отобразить cms.cmx_sentiment на фильтре для создания отчета НО I необходимо применить условие

УЛУЧШЕНИЕ ЗАПРОСА ВЫШЕ

GET socialmedia/_search
{
  "size" : 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "CMS": {
      "nested": {
        "path": "cms"
      },
      "aggs": {
        "FILTER": {
          "filter": {
            "bool": {
              "must" : [
                {
                  "match" : {
                    "cms.cli_id" : 0 <--- I need a query to make this dynamic
                  }
                }
              ]
            }
          },
          "aggs": {
            "SENTIMENT": {
              "terms": {
                "field" : "cms.cmx_sentiment"
              }
            }
          }
        }
      }
    }
  }
}

ВЫХОД

"aggregations" : {
  "CMS" : {
    "doc_count" : 6,
    "FILTER" : {
      "doc_count" : 1,
      "SENTIMENT" : {
        "doc_count_error_upper_bound" : 0,
        "sum_other_doc_count" : 0,
        "buckets" : [
          {
            "key" : "Positive",
            "doc_count" : 2
          },
          {
            "key" : "Negative",
            "doc_count" : 1
          },
          {
            "key" : "Neutral",
            "doc_count" : 1
          }
        ]
      }
    }
  }
}

ЦЕЛЬ

Есть ли способ для меня выступить сценария ES с этим PHP logi c?

  • , если cli_id зарегистрированного пользователя in_array из cms.cli_id вложенное поле, извлеките его соответствующее cmx_sentiment
  • , если cli_id зарегистрированного пользователя IS NOT в вложенные элементы cms , извлеките элементы с помощью cli_id: 0 , затем получите cmx_sentiment

ИСПОЛЬЗОВАТЬ СЛУЧАИ

с приведенными выше примерами статей index

IF cli_id 4599 входит в приложение

"SENTIMENT" : {
  "doc_count_error_upper_bound" : 0,
  "sum_other_doc_count" : 0,
  "buckets" : [
    {
      "key" : "Positive",
      "doc_count" : 3
    },
    {
      "key" : "Neutral",
      "doc_count" : 1
    }
  ]
}

ЕСЛИ cli_id 12 входит в приложение

"SENTIMENT" : {
  "doc_count_error_upper_bound" : 0,
  "sum_other_doc_count" : 0,
  "buckets" : [
    {
      "key" : "Negative",
      "doc_count" : 2
    },
    {
      "key" : "Positive",
      "doc_count" : 1
    },
    {
      "key" : "Neutral",
      "doc_count" : 1
    }
  ]
}

ЕСЛИ любой cli_id входит в приложение

"SENTIMENT" : {
  "doc_count_error_upper_bound" : 0,
  "sum_other_doc_count" : 0,
  "buckets" : [
    {
      "key" : "Positive",
      "doc_count" : 2
    },
    {
      "key" : "Negative",
      "doc_count" : 1
    },
    {
      "key" : "Neutral",
      "doc_count" : 1
    }
  ]
}

Как можно улучшить мой запрос, чтобы я мог поместить условный оператор в аггре FILTER моего запроса?

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