多个query_strings(嵌套而非嵌套)

时间:2017-05-29 08:08:21

标签: elasticsearch

我有以下索引:

{
   "thread":{
      "properties":{
         "members":{
            "type":"nested",
            "properties":{
               "memberId":{
                  "type":"keyword"
               },
               "firstName":{
                  "type":"keyword",
                  "copy_to":[
                     "members.fullName"
                  ]
               },
               "fullName":{
                  "type":"text"
               },
               "lastName":{
                  "type":"keyword",
                  "copy_to":[
                     "members.fullName"
                  ]
               }
            }
         },
         "name":{
            "type":"text"
         }
      }
   }
}

我希望实现一个搜索,找到所有与成员名称或线程名称匹配的线程,只要用户ID匹配。

我当前的查询如下所示:

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "members",
            "score_mode": "none",
            "query": {
              "bool": {
                "filter": [
                  { "match": { "members.id": "123456789" } }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "members",
            "query": {
              "bool": {
                "must": {
                  "simple_query_string": {
                    "query": "Rhymen",
                    "fields": ["members.fullName"]
                  }
                }
              }
            }
          }
        }
      ]
    }
  }
}

我可以在一个查询中过滤成员和线程名称,还是必须合并两个单独的查询?我尝试添加“should”和“minimum_should_match:1”,这样我就可以添加第二个不嵌套的“query_string”。但这并没有像预期的那样发挥作用(分数相当紧张)。

1 个答案:

答案 0 :(得分:1)

是的,我认为这应该有用。

你必须在两个过滤器中保持对filter memberId的关注。嵌套过滤器将需要它来匹配用户与memberId和name。

{
    "query": {
        "bool": {
            "must": [{
                    "nested": {
                        "path": "members",
                        "query": {
                            "term": {
                                "members.memberId": {
                                    "value": 1
                                }
                            }
                        }
                    }
                },
                {
                    "bool": {
                        "should": [{
                                "term": {
                                    "name": {
                                        "value": "thread_name"
                                    }
                                }
                            },
                            {
                                "nested": {
                                    "path": "members",
                                    "query": {
                                        "bool": {
                                            "should": [{
                                                    "term": {
                                                        "members.fullName": {
                                                            "value": "trump"
                                                        }
                                                    }
                                                },
                                                {
                                                    "term": {
                                                        "members.memberId": {
                                                            "value": 1
                                                        }
                                                    }
                                                }
                                            ]
                                        }
                                    }
                                }
                            }
                        ]
                    }
                }
            ]
        }
    }
}