如何按ElasticSearch中的字段值进行过滤?

时间:2016-03-23 20:32:45

标签: elasticsearch filter

鉴于以下ElasticSearch文档:

{
    "_id": "3330481",
    "_type": "user",
    "_source": {
        "id": "3330481",
        "following": ["1", "2", "3", ... , "15000"]
    }
}

对于给定的用户列表[" 50"," 51"," 52"]我想检查ID为3330481的用户遵循哪些用户列表由于她关注的是15000名用户,我不想获得整个列表,然后在本地查看。

有没有办法只检索相关用户?

2 个答案:

答案 0 :(得分:2)

我不确定您是否可以从文档中获取子数组。

但是,实现此目的的一种方法是使用嵌套字段。您可以将following字段的架构更改为nested,如下所示。

 {
        "id": "3330481",
        "following": [
              {"userId":"1"}, {"userId":"2"},{"userId": "3"}, ... ]
 }

然后您可以使用inner_hits检索数组中的匹配元素,如下所示。

{
    "query" : {
        "nested" : {
            "path" : "following",
            "query" : {
                "terms" : {"following.userId" : ["50","51","53"]}
            },
            "inner_hits" : {
                "size":0 // fetches all 
            }
        }
    }
}

答案 1 :(得分:0)

如果您只是想要使用["50", "51", "52"]检索所有用户而没有影响分数,则可以将minimum_should_match与bool查询一起使用。例如:

{
  "query" : {
    "filtered" : {
      "filter" : {
        "bool": {
          "must": {
            "terms": {
              "following": ["50", "51", "52"],
              "minimum_should_match": 3
            }
          }
        }
      }
    }
  }
}