2017-02-25 110 views
0

我需要为ElasticSearch 5.1的查询请求使用多个过滤器(范围和术语)。如果我分开使用(只有一个过滤器),它是确定:ElasticSearch 5.1使用乘法滤波器过滤查询

var o = new 
      { 
       size = 20, 
       query = new 
       { 
        @bool = new 
        { 
         must = new 
         { 
          query_string = new 
          { 
           fields = new[] { "Title" }, 
           query = search_query 
          } 
         }, 
         filter = new 
         { 
          terms = new 
          { 
           SourceId = new[] {10,11,12} 
          } 
         } 
        } 
       }     
      }; 

OR

var o = new 
      { 
       size = 20, 
       query = new 
       { 
        @bool = new 
        { 
         must = new 
         { 
          query_string = new 
          { 
           fields = new[] { "Title" }, 
           query = search_query 
          } 
         }, 
         filter = new 
         { 
          range = new 
          { 
           PostPubDate = new 
           { 
            gte = "2015-10-01T00:00:00", 
            lte = "2015-11-01T12:00:00" 
           } 
          } 
         } 
        } 
       }     
      }; 

如果我使用他们两个我得到响应400错误:

string url = "http://localhost:9200/neg_collector/posts/_search"; 
      var request = (HttpWebRequest)HttpWebRequest.Create(url); 
      var o = new 
      { 
       size = 20, 
       query = new 
       { 
        @bool = new 
        { 
         must = new 
         { 
          query_string = new 
          { 
           fields = new[] { "Title" }, 
           query = search_query 
          } 
         }, 
         filter = new 
         { 
          terms = new 
          { 
           SourceId = new[] {10,11,12} 
          }, 
          range = new 
          { 
           PostPubDate = new 
           { 
            gte = "2015-10-01T00:00:00", 
            lte = "2015-11-01T12:00:00" 
           } 
          } 
         } 
        } 
       }     
      }; 


      request.Method = "POST"; 
      var jsonObj = JsonConvert.SerializeObject(o); 
      var data = Encoding.UTF8.GetBytes(jsonObj); 
      request.ContentType = "application/x-www-form-urlencoded"; 
      request.ContentLength = data.Length; 
      using (var stream = request.GetRequestStream()) 
      { 
       stream.Write(data, 0, data.Length); 
      } 

      string responseString = string.Empty; 
      var response = (HttpWebResponse)request.GetResponse(); 

我是什么做错了?谢谢

回答

1

你的过滤器只需要为对象的数组:

... 
        filter = new object[] 
        { 
         new { 
         terms = new 
         { 
          SourceId = new[] {10,11,12} 
         } 
         }, 
         new { 
         range = new 
         { 
          PostPubDate = new 
          { 
           gte = "2015-10-01T00:00:00", 
           lte = "2015-11-01T12:00:00" 
          } 
         } 
         } 
        } 
+0

谢谢你很多!它现在有效 –

+0

真棒,很高兴它的工作! – Val