在Elasticsearch中搜索对象数组

时间:2019-10-10 11:35:12

标签: elasticsearch

我正在使用elasticsearch-6.4.3

我使用以下映射创建了索引test_index:

PUT test_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "name": {
          "type": "keyword"
        },
        "segments": {
          "type": "nested",
          "properties": {
            "f1": {
              "type": "keyword"
            },
            "f2": {
              "type": "integer"
            }
          }
        }
      }
    }
  }
}

我使用以下命令在索引中插入了文档:

POST /test_index/_doc
{
  "name": "ABC",
  "segments": [{
    "f1": "abc",
    "f2": 123
  }, 
  {
    "f1": "def",
    "f2": 124
  }]
}

我有一个说arr = ["def", "xyz"]的值数组。我想将f1 field in segments field中至少一个匹配的所有文档与给定数组arr中的任何值匹配。

您可以将其命名为array_intersect之类,以便于理解。

我正在尝试这样的事情:

GET /test_index/_search
{
"query": {
    "nested": {
      "path": "segments",
      "query": {
        "bool": {
          "must": [
            {
              "terms": {
                "f1": [ 
                  "def",
                  "xyz"
                ]
              }
            }
          ]
        }
      }
    }
  }
}

我没有得到任何结果。
Expected output:文档应该匹配,因为文档中f1的值表示为“ def”。

1 个答案:

答案 0 :(得分:1)

您需要在词条查询中将完整路径指定为segments.f1,而不是nested queryf1

按如下所示修改查询:

POST test_index/_search
{ 
   "query":{ 
      "nested":{ 
         "path":"segments",
         "query":{ 
            "bool":{ 
               "must":[ 
                  { 
                     "terms": {
                       "segments.f1": ["def","xyz"]    <---- Mention full path here

                     }
                  }
               ]
            }
         }
      }
   }
}

希望这会有所帮助!