如何在ElasticSearch中的数组中搜索单独的键和值字段?

时间:2018-06-28 21:22:06

标签: elasticsearch

我的ElasticSearch文档包含一个 nested 表单域集合。每个字段都有一个名称和一个值,并且映射如下:

form: {
  properties: {
    id:         { type: 'integer' },
    name:       { type: 'text' },
    form_data:  {
      type: 'nested',
      properties: {
        'name':  { type: 'keyword' },
        'value': { type: 'text', analyzer: 'full_text_analyzer' }
      }
    }
  }
}

我需要允许用户搜索多个表单字段以完善他们的搜索。他们可以选择要搜索的字段,并为每个字段分配一个值。例如

applicant_name = 'Joe'
pet_type = 'dog'

这将找到所有包含名称为applicant_name且具有值模糊匹配Joe的字段以及名为pet_type和具有值模糊匹配dog的字段的所有文档

我正在尝试使用的查询如下:

{
  "query": {
    "bool": {
      "must": [{
        "nested": {
          "path": "form_data",
          "query": {
            "filter": {
              "bool": {
                "must": [
                  {
                    "bool": {
                      "must": [
                        { "term": { "form_data.name": "applicant_name" } },
                        { "match": { "form_data.value": "Joe" } }
                      ]
                    }
                  },
                  {
                    "bool": {
                      "must": [
                        { "term": { "form_data.name": "pet_type" } },
                        { "match": { "form_data.value": "dog" } }
                      ]
                    }
                  }
                ]
              }
            }
          }
        }
      }]
    }
  }
}

但是,我得到0个结果。

1 个答案:

答案 0 :(得分:1)

尝试在您的初始“必须”子句中按条件使用嵌套查询:

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "form_data",
            "query": {
              "bool": {
                "must": [
                  { "term": { "form_data.name": "applicant_name" } },
                  { "match": { "form_data.value": "Joe" } }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "form_data",
            "query": {
              "bool": {
                "must": [
                  { "term": { "form_data.name": "pet_type" } },
                  { "match": { "form_data.value": "dog" } }
                ]
              }
            }
          }
        }
      ]
    }
  }
}