Запрос о значении ответа

Как написать условный запрос по нескольким полям? Объясните: У меня есть индекс, допустим "case" и поля: "title", "secondTitle(contain nested obj)", "source(contain nested obj)". Теперь я хочу искать по заголовку и номеру документа внутри secondTitle, который также содержится в source поле другого документа.

PUT /case_indx_tmp_tmp
{
  "mappings": {
    "properties": {
      "title":{
        "type": "text",
        "fields": {
          "title":{
            "type":"keyword"
          }
        }
      },
      "secondTitle":{
        "type": "nested",
        "properties": {
          "second_title":{
            "type":"text",
            "fields": {
              "secondtitle":{
                "type":"keyword"
              }
        }
          }
        }
      },
      "source":{
        "type": "nested",
        "properties": {
          "source_title":{
            "type":"text",
            "fields": {
              "sourcetitle":{
                "type":"keyword"
              }
        }
          }
        }
      }
    }
  }
}

PUT /case_indx_tmp_tmp/_doc/1
{
    "title" : "Case 1",
    "secondTitle" : [
        {
            "case_title" : "Case 2"
        }
    ],
    "source":[
      {
        "source_title":"Case 3"
      },
      {
        "source_title":"Case 4"
      }
    ]
}
PUT /case_indx_tmp_tmp/_doc/2
{
    "title" : "Case 2",
    "secondTitle" : [
        {
            "case_title" : "Case 3"
        },
        {
            "case_title" : "Case 4"
        },
        {
            "case_title" : "Case 1"
        }
    ],
    "source":[
      {
        "source_title":"Case 1"
      }
    ]
}
PUT /case_indx_tmp_tmp/_doc/3
{
    "title" : "Case 3",
    "secondTitle" : [
        {
            "case_title" : "Case 5"
        },
        {
            "case_title" : "Case 4"
        },
        {
            "case_title" : "Case 1"
        }
    ],
    "source":[
      {
        "source_title":"Case 2"
      },
      {
        "source_title":"Case 5"
      }
    ]
}
PUT /case_indx_tmp_tmp/_doc/4
{
    "title" : "Case 5",
    "source":[
      {
        "source_title":"Case 3"
      },
      {
        "source_title":"Case 4"
      },
      {
        "source_title":"Case 2"
      }
    ]
}

если поисковый запрос - "Case", то будет возвращено заголовок: Дело 1 secondTitle_count: 1

заголовок: Случай 2 secondTitle_count: 3

заголовок: Случай 3 secondTitle_count: 2

title: Случай 5 secondTitle_count: 0

Моим решением было итерация всех документов, которые возвращаются после поискового запроса, и создание нового объекта bool query для поля "source", где значения находятся из secondTitle.

Вы можете использовать комбинацию агрегации терминов и вложенной агрегации с агрегацией подсчета значений.

В следующем запросе,

  1. Запрос match используется для получения только тех документов, которые содержат case в поле title.

  2. Агрегация терминов создаст ведро всех уникальных значений поля title.

  3. Вложенная агрегация вместе с агрегацией подсчета значений будет агрегировать результат агрегации терминов и получит подсчет документов, присутствующих в объекте secondTitle.


POST case_indx_tmp_tmp/_search
{
  "size": 0,
  "query": {
    "match": {
      "title": "case"
    }
  }, 
  "aggs": {
    "top_tags_per_comment": {
      "terms": {
        "field": "title.title"
      },
      "aggs": {
        "Services": {
          "nested": {
            "path": "secondTitle"
          },
          "aggs": {
            "secondTitle_count": {
              "value_count": {
                "field": "secondTitle.case_title.keyword"
              }
            }
          }
        }
      }
    }
  }
}

Результатом поиска будет

"aggregations" : {
    "top_tags_per_comment" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "Case 1",
          "doc_count" : 1,
          "Services" : {
            "doc_count" : 1,
            "secondTitle_count" : {
              "value" : 1
            }
          }
        },
        {
          "key" : "Case 2",
          "doc_count" : 1,
          "Services" : {
            "doc_count" : 3,
            "secondTitle_count" : {
              "value" : 3
            }
          }
        },
        {
          "key" : "Case 3",
          "doc_count" : 1,
          "Services" : {
            "doc_count" : 3,
            "secondTitle_count" : {
              "value" : 3
            }
          }
        },
        {
          "key" : "Case 5",
          "doc_count" : 1,
          "Services" : {
            "doc_count" : 0,
            "secondTitle_count" : {
              "value" : 0
            }
          }
        }
      ]
    }
  }
Вернуться на верх