假设我有用户,团队和运动员文档。用户文档具有与团队ID相关的对象数组。将密钥与用户归档匹配后,我需要在单个查询中从团队获取相关数据。

我有下面的东西

"size": 20,
"query": {
  "bool": {
  "filter" : [
    {"terms" : { "_type" :["users","athletes"] }}
   ],
   "should":[{
     "multi_match" : {
          "query":searchQuery,
          "type":"cross_fields",
          "fields":["firstName", "email","lastName","name"],
          "minimum_should_match": "80%"
        }
    }
   ],
    "minimum_should_match" : 1
  }
}

最佳答案

ElasticSearch在这方面受到限制,但是您可以使用has_child查询来查询运动员并获得相应的团队。

为了使用has_child查询,您需要在索引定义中建立团队与运动员之间的父子关系:

PUT运动

{
  "mappings" : {
    "team" : {
      "properties" : {
        "name" : {
          "type" : "text"
        }
      }
    },
    "athlete" : {
      "dynamic" : "false",
      "_parent" : {
          "type" : "team"
        },
        "_routing" : {
          "required" : true
        },
      "properties" : {
        "name" : {
          "type" : "text"
        }
      }
    }
  }
}

注意"_parent"元素。

然后,您需要向父实体(团队)添加一些数据:

PUT体育/团队
{
  "name" : "A"
}

然后,您将需要索引一些将它们与父级关联的运动员:

PUT运动/运动员? parent = dc2b3e8f-7dea-4898-9852-538c0d0367f4
{
  "name" : "Gil Fernandes"
}

请注意,“dc2b3e8f-7dea-4898-9852-538c0d0367f4”是Elastic Search中团队的ID。

最后,您可以执行has_child查询:
{
  "from" : 0,
  "size" : 20,
  "_source" : true,
  "query" : {
    "bool" : {
      "must" : [ {
        "has_child" : {
          "type" : "athlete",
          "query" : {
            "match" : {
              "name" : "Gil Fernandes"
            }
          }
        }
      } ]
    }
  }
}

结果,您将获得运动员团队:
{
  "took" : 10,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "sports",
      "_type" : "team",
      "_id" : "dc2b3e8f-7dea-4898-9852-538c0d0367f4",
      "_score" : 1.0,
      "_source" : {
        "name" : "A"
      }
    } ]
  }
}

关于elasticsearch - 如何像jon查询一样从elasticsearch获取数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46278000/

10-17 03:15