elasticsearch 我可以在Elastic中过滤数组吗?

rjee0c15  于 11个月前  发布在  ElasticSearch
关注(0)|答案(1)|浏览(90)

我不得不将大量数据插入到弹性中,我以下面的方式完成了这一点。我需要查询这个对象,但我无法过滤“logData”数组。有人能帮助我吗?甚至可以在弹性中过滤数组吗?

"_source": {
  "FileName": "fileName.log"
  "logData": [
    {
       "LineNumber": 1,
       "Data": "data1"
    },
    {
       "LineNumber": 2,
       "Data": "Data2"
    },
    {
       "LineNumber": 3,
       "Data": "Data3"
    },
    {
       "LineNumber": 4,
       "Data": "Data4"
    },
    {
       "LineNumber": 5,
       "Data": "Data5"
    },
    {
       "LineNumber": 6,
       "Data": "Data6"
    }
  ]
}

字符串
有没有一种方法来查询,这样我就可以从这个数组中只得到几个项目?比如:

"_source": {
  "FileName": "fileName.log"
  "logData": [
    {
       "LineNumber": 1,
       "Data": "data1"
    },
    {
       "LineNumber": 2,
       "Data": "Data2"
    },
    {
       "LineNumber": 3,
       "Data": "Data3"
    }
  ]
}

pxy2qtax

pxy2qtax1#

ES中有no dedicated数组Map类型。
也就是说,当你有一个具有共享键的对象数组时,建议你使用nested field type来保留各个子对象属性的连接。如果你不使用nested,对象将被扁平化,这可能会导致 * 看似 * 错误的查询结果。
至于实际的查询--假设您的Map看起来像这样:

PUT logs_index
{
  "mappings": {
    "properties": {
      "logData": {
        "type": "nested"
      }
    }
  }
}

字符串
你需要过滤那些感兴趣的logData子文档,也许用一个terms_query。然后,也只有这样,你才能只提取那些匹配这个查询的数组对象(lineNumber: 1 or 2 or 3)。
这种技术被称为inner_hits

POST logs/_search
{
  "_source": ["FileName", "inner_hits.logData"],
  "query": {
    "nested": {
      "path": "logData",
      "query": {
        "terms": {
          "logData.LineNumber": [
            1,
            2,
            3
          ]
        }
      },
      "inner_hits": {}
    }
  }
}


查看this thread了解更多信息。

相关问题