Как получить уникальные документы в поиске elasti c на основе поля и сгруппировать результат по другим полям - PullRequest
0 голосов
/ 19 апреля 2020

Я только что начал поиск elasti c, и мне нужно решить слишком сложную для меня проблему. У меня есть тысячи документов в индексе, из которых мне нужно запросить заранее определенное количество документов (которые также могут быть несколько тысяч), я должен найти группы документов, основанные на некоторых полях, из уникальных документов, основанных на другом поле. (количество уникальных документов может достигать нескольких сотен).

Документ в моем индексе выглядит следующим образом:

{  
 "complexProperty1" : {
            "A" : "example",
            "B" : "1",
            "D" : true,
            "E" : "case",
            "F" : ["guide1","guide2"]
},
   "complexProperty2" : {
            "X" : "10",
            "Y" : ["specimen1","specimen2"],
            "Z" : "blueprint"
}
}

Многие документы будут иметь complexProperty1.A как " пример ". Я хочу включить их один раз, и полученные документы должны быть сгруппированы по complexProperty1.D и complexProperty1.E, т.е. для каждой пары complexProperty1.D и complexProperty1.E у меня есть список документов (эти документы мне нужны только в моем результат). Я использую Nest для достижения этой цели.

1 Ответ

0 голосов
/ 19 апреля 2020

Вы можете начать с нескольких необработанных terms агрегатов и вернуться к NEST DSL :

POST complexities/_doc
{
  "complexProperty1": {
    "A": "example",
    "B": "1",
    "D": true,
    "E": "case",
    "F": [
      "guide1",
      "guide2"
    ]
  },
  "complexProperty2": {
    "X": "10",
    "Y": [
      "specimen1",
      "specimen2"
    ],
    "Z": "blueprint"
  }
}
GET complexities/_search
{
  "size": 0,
  "aggs": {
    "by_A": {
      "terms": {
        "field": "complexProperty1.A.keyword"
      },
      "aggs": {
        "by_D": {
          "terms": {
            "field": "complexProperty1.D"
          }
        },
        "by_E": {
          "terms": {
            "field": "complexProperty1.E.keyword"
          }
        }
      }
    }
  }
}

Чтобы получить базовые документы, вы можете добавить агг top_hits к каждой субагг, вкл. верхний уровень:

{
  "size": 0,
  "aggs": {
    "by_A": {
      "terms": {
        "field": "complexProperty1.A.keyword"
      },
      "aggs": {
        "top_hits_only": {
          "top_hits": {
            "_source": "*"
          }
        },
        "by_D": {
          "terms": {
            "field": "complexProperty1.D"
          },
          "aggs": {
            "top_hits_only": {
              "top_hits": {
                "_source": "*"
              }
            }
          }
        },
        "by_E": {
          "terms": {
            "field": "complexProperty1.E.keyword"
          },
          "aggs": {
            "top_hits_only": {
              "top_hits": {
                "_source": "*"
              }
            }
          }
        }
      }
    }
  }
}
...