Alexey Rumin
Alexey Rumin

Reputation: 303

ElasticSearch 5.1 filtered query with multiply filters

I need to use several filters (range and terms) for query request with ElasticSearch 5.1. If I use them separately (only one filter) it is OK:

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"
                                }
                            }
                        }
                    }
                }                
            };

If I use them both I get response 400 error:

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();

What am I doing wrong? Thank you

Upvotes: 0

Views: 65

Answers (1)

Val
Val

Reputation: 217424

Your filter simply needs to be an array of objects:

    ...
                    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"
                            }
                        }
                      }
                    }

Upvotes: 1

Related Questions