2017-05-29 17 views
1

我有以下指标:多发性QUERY_STRINGS(嵌套而不是嵌套)

{ 
    "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"] 
        } 
       } 
       } 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

我可以过滤成员和线程的名字在一个查询或者我必须合并两个单独的查询?我试着用“minimum_should_match:1”添加一个“should”,这样我就可以添加第二个没有嵌套的“query_string”。但是这并没有像预期的那样工作(分数非常糟糕)。

回答

1

是的,我认为这应该工作。

您必须在两个过滤器中关注过滤器memberId。嵌套过滤器将需要它来匹配用户与memberId和名称。

{ 
    "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 
                 } 
                } 
               } 
              ] 
             } 
            } 
           } 
          } 
         ] 
        } 
       } 
      ] 
     } 
    } 
}