Elasticsearch — как выполнить запрос с условием и отсортировать требуемый файл без дублирования

#elasticsearch

#elasticsearch

Вопрос:

я был новичком в ES, теперь я могу сортировать поле в своей базе данных с помощью condition alarm! = 0 код был здесь:

     {
    "size":1,
  "query": {
    "bool": {
      "must_not": {
        "term": {
          "header.alarmStatus": 0
        }
      }
    }//bool
   //query
  }
}
  

и это показывает, что у него около 4000 попаданий, и это все, что я хочу
, чтобы ответ на это (size = 1) был следующим

 "hits": {
    "total": {
        "value": 3842,
        "relation": "eq"
    },
    "max_score": 0.0,
    "hits": [
        {
            "_index": "index123",
            "_type": "meter",
            "_id": "63iti3QBSliyJ__JFt6C",
            "_score": 0.0,
            "_source": {
                "header": {
                    "meterId": 1245,
                    
                },
                "data": {
                    "seqNum": 72
                  
            }
        }
    ]
}
  

И мой вопрос в том, как я могу выполнить запрос с условием «header.alarmStatus»: != 0
и перечислить все идентификаторы счетчиков с повторяющимися счетчиками?
Спасибо

Джефф

Комментарии:

1. не могли бы вы поделиться ожидаемым результатом поиска и, пожалуйста, объяснить, что вы подразумеваете под количеством дубликатов здесь?

Ответ №1:

Насколько я могу понять, вам нужно перечислить все meterId (удалив количество дубликатов) для запроса с условием "header.alarmStatus": !=0 . Для этого вы можете использовать агрегацию терминов с агрегацией мощности в качестве подагрегации

Индексировать данные:

 {
  "header": {
    "meterId": 1246,
    "alarmStatus": 3
  },
  "data": {
    "seqNum": 72
  }
}
{
  "header": {
    "meterId": 1246,
    "alarmStatus": 2
  },
  "data": {
    "seqNum": 72
  }
}
{
  "header": {
    "meterId": 1245,
    "alarmStatus": 1
  },
  "data": {
    "seqNum": 72
  }
}
  

Поисковый запрос:

 {
  "query": {
    "bool": {
      "must_not": {
        "term": {
          "header.alarmStatus": 0
        }
      }
    }
  },
  "aggs": {
    "genres": {
      "terms": {
        "field": "header.meterId"
      },
      "aggs": {
        "item_count": {
          "cardinality": {
            "field": "header.meterId"       
          }
        }
      }
    }
  }
}
  

Результат поиска:

  "aggregations": {
    "genres": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": 1246,
          "doc_count": 2,
          "item_count": {
            "value": 1
          }
        },
        {
          "key": 1245,
          "doc_count": 1,
          "item_count": {
            "value": 1
          }
        }
      ]
    }
  

Комментарии:

1. @Man Man Yu повезло с этим?

2. @Man Man Yu прошло много времени. У вас была возможность просмотреть мой ответ, с нетерпением жду обратной связи от вас 🙂

3. @ManManYu Рад, что это сработало для вас 🙂 Спасибо, что приняли мой ответ, не могли бы вы также проголосовать за ответ 🙂