0

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

1 Answer 1

1

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"
                            }
                        }
                      }
                    }
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.