如何从像jon查询这样的elasticsearch获取数据

时间:2017-09-18 11:17:17

标签: elasticsearch

让我们说我有用户,团队和运动员的文件。用户文档具有与团队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
  }
}

1 个答案:

答案 0 :(得分: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 sports / athlete?parent = dc2b3e8f-7dea-4898-9852-538c0d0367f4

{
  "name" : "Gil Fernandes"
}

请注意,“dc2b3e8f-7dea-4898-9852-538c0d0367f4”是弹性搜索中团队的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"
      }
    } ]
  }
}