弹性搜索过滤查询,查询部分被忽略?

时间:2015-09-16 10:14:05

标签: filter dsl elasticsearch

我在代码中构建了以下搜索,其想法是过滤掉匹配集然后查询,这样我就可以根据某些字段添加分数。由于某种原因,过滤器部分工作,但无论我在查询中放置什么(即在下面我没有索引sdfsdfsdf)它仍然返回与过滤器匹配的任何内容。

语法错了吗?

 {  
       "query":{  
          "filtered":{  
             "query":{  
                "bool":{  
                   "must":{  
                      "match":{  
                         "sdfsdfsdf":{  
                            "query":"4",
                            "boost":2.0
                         }
                      }
                   }
                },
                "filter":{  
                   "bool":{  
                      "must":[  
                         {  
                            "terms":{  
                               "_id":[  
                                  "55f93ead5df34f1900abc20b",
                                  "55f8ab0226ec4bb216d7c938",
                                  "55dc4e949dcf833308c63d6b"
                               ]
                            }
                         },
                         {  
                            "range":{  
                               "published_date":{  
                                  "lte":"now"
                               }
                            }
                         }
                      ],
                      "must_not":{  
                         "terms":{  
                            "_id":[  
                               "55f0a799acccc28204a5058c"
                            ]
                         }
                      }
                   }
                }
             }
          }
       }
    }

2 个答案:

答案 0 :(得分:1)

您的filter未达到正确的级别。它不应该在query内,而应与query相同,如下所示:

{
  "query": {
    "filtered": {
      "query": {          <--- query and filter at the same level
        "bool": {
          "must": {
            "match": {
              "sdfsdfsdf": {
                "query": "4",
                "boost": 2
              }
            }
          }
        }
      },
      "filter": {         <--- query and filter at the same level
        "bool": {
          "must": [
            {
              "terms": {
                "_id": [
                  "55f93ead5df34f1900abc20b",
                  "55f8ab0226ec4bb216d7c938",
                  "55dc4e949dcf833308c63d6b"
                ]
              }
            },
            {
              "range": {
                "published_date": {
                  "lte": "now"
                }
              }
            }
          ],
          "must_not": {
            "terms": {
              "_id": [
                "55f0a799acccc28204a5058c"
              ]
            }
          }
        }
      }
    }
  }
}

答案 1 :(得分:0)

您需要将sdfsdfsdf替换为您的类型中的现有字段名称,例如title,否则我认为它将回退到match_all查询。

"match":{  
        "title":{  
              "query": "some text here",
              "boost":2.0
        }
}