我有一个带有以下形式的项目的elasticsearch DB

record = {
            'diagnosis': self.diagnosis,
            'vignette': self.vignette,
            'symptoms': self.symptoms_list,
            'care': self.care_level_string,
            'age': self.age,
            'gender': self.gender
        }

我需要一个查询,该查询返回'age'(浮点型)的分布,而另一个查询返回关于'gender'(带有3个选项的字符串)的'care'(具有2个选项的字符串)的分布。

举例来说,如果数据库有
1. care='a', age=1.0, gender='m'
2. care='b', age=2.0, gender='m'
3. care='c', age=1.0, gender='m'
4. care='a', age=1.0, gender='m'
5. care='b', age=2.0, gender='m'
6. care='c', age=3.0, gender='m'
7. care='a', age=3.0, gender='f'
8. care='b', age=3.0, gender='f'

那么关于gendercare='a'分布将返回类似
{'m:2, 'f':1}
我似乎无法获得正确的语法/理解

我正在使用python

谢谢!

最佳答案

看您的问题,我想出了以下映射,查询和响应。

制图

PUT medicalrecord
{
  "mappings": {
    "mydocs": {
      "properties": {
        "diagnosis": {
          "type": "text"
        },
        "vignette": {
          "type": "text"
        },
        "symptoms": {
          "type": "text"
        },
        "care": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword"
            }
          }
        },
        "age": {
          "type": "integer"
        },
        "gender":{
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword"
            }
          }
        }
      }
    }
  }
}

注意我如何为gendercare创建多个字段。我建议您仔细阅读link,以便您了解其相关性。

询问

下面的查询是您要寻找的。

它是对care的简单Filter Using Bool查询,然后是gender字段上的Terms Aggregation的组合。
POST medicalrecord/_search
{
  "size": 0,
  "query": {
    "bool": {
      "filter": {
        "term": {
          "care.keyword": "a"
        }
      }
    }
  },
  "aggs": {
    "mf_distribution": {
      "terms": {
        "field": "gender.keyword"
      }
    }
  }
}

请注意,我已经为值carea创建了一个查询。您可以为它的其他值构造类似的查询。

看着您的问题,我相信您只是从Elasticsearch开始。我建议您花一些时间阅读有关Aggregations的信息。

以下是您对上述查询的回应显示方式。

响应
{
  "took" : 10,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "mf_distribution" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "m",
          "doc_count" : 2
        },
        {
          "key" : "f",
          "doc_count" : 1
        }
      ]
    }
  }
}

您想要的内容可以在buckets下看到。

希望这可以帮助!

08-28 02:54