public void TestFilterdQuery()
        {

            var termQuery = new TermQuery("type", "common");
            var termFilter = new TermFilter("age", "24");
            var filteredQuery = new FilteredQuery(termQuery,termFilter);
            var result2 = client.Search(index, "type" , filteredQuery, 0, 5);
            Assert.AreEqual(1, result2.GetTotalCount());
            Assert.AreEqual(1, result2.GetHits().Hits.Count);

            var wildQuery = new WildcardQuery("name", "张三*");
            termFilter = new TermFilter("age", "23");
            filteredQuery = new FilteredQuery(wildQuery, termFilter);
            result2 = client.Search(index, "type" , filteredQuery, 0, 5);
            Assert.AreEqual(1, result2.GetTotalCount());
            Assert.AreEqual(1, result2.GetHits().Hits.Count);
            Assert.AreEqual("张三丰",result2.GetHits().Hits[0].Source["name"]);


            var boolQuery = new BoolQuery();
            boolQuery.Must(new TermQuery("type", "common"));
            boolQuery.Must(new WildcardQuery("name", "张三*"));
            boolQuery.Should(new TermQuery("age", 24));

            filteredQuery=new FilteredQuery(boolQuery,new TermFilter("age","23"));

            result2 = client.Search(index, "type" , filteredQuery, 0, 5);
            Assert.AreEqual(1, result2.GetTotalCount());
            Assert.AreEqual(1, result2.GetHits().Hits.Count);
            Assert.AreEqual("张三丰", result2.GetHits().Hits[0].Source["name"]);



            filteredQuery = new FilteredQuery(boolQuery, new TermFilter("age", "24"));

            result2 = client.Search(index, "type" , filteredQuery, 0, 5);
            Assert.AreEqual(1, result2.GetTotalCount());
            Assert.AreEqual(1, result2.GetHits().Hits.Count);
            Assert.AreEqual("张三", result2.GetHits().Hits[0].Source["name"]);


            filteredQuery = new FilteredQuery(boolQuery, new TermFilter("type", "common"));

            result2 = client.Search(index, "type" , filteredQuery, 0, 5);
            Assert.AreEqual(2, result2.GetTotalCount());
            Assert.AreEqual(2, result2.GetHits().Hits.Count);

            
            //test should

            boolQuery = new BoolQuery();
            boolQuery.Must(new TermQuery("type", "common"));
            boolQuery.Must(new WildcardQuery("name", "张*"));
            boolQuery.Should(new TermQuery("age", 24));

            filteredQuery = new FilteredQuery(boolQuery, new TermFilter("type", "common"));

            result2 = client.Search(index, "type" , filteredQuery, 0, 5);
            Assert.AreEqual(3, result2.GetTotalCount());
            Assert.AreEqual(3, result2.GetHits().Hits.Count);

            boolQuery = new BoolQuery();
            boolQuery.Must(new TermQuery("type", "common"));
            boolQuery.Must(new WildcardQuery("name", "张*"));
            boolQuery.Should(new TermQuery("age", 24));
            boolQuery.Should(new TermQuery("age", 28));
            boolQuery.Should(new TermQuery("age", 22));
            //must+should ->[should] make nonsense
            filteredQuery = new FilteredQuery(boolQuery, new TermFilter("type", "common"));

            result2 = client.Search(index, "type" , filteredQuery, 0, 5);
            Assert.AreEqual(3, result2.GetTotalCount());
            Assert.AreEqual(3, result2.GetHits().Hits.Count);


            boolQuery = new BoolQuery();
            boolQuery.Should(new TermQuery("age", 24));
            boolQuery.Should(new TermQuery("age", 28));
            boolQuery.Should(new TermQuery("age", 22));
            filteredQuery = new FilteredQuery(boolQuery, new TermFilter("type", "common"));

            result2 = client.Search(index, "type" , filteredQuery, 0, 5);
            Assert.AreEqual(1, result2.GetTotalCount());
            Assert.AreEqual(1, result2.GetHits().Hits.Count);
            Assert.AreEqual("张三", result2.GetHits().Hits[0].Source["name"]);


            boolQuery.Should(new TermQuery("age", 25));
            filteredQuery = new FilteredQuery(boolQuery, new TermFilter("type", "common"));

            result2 = client.Search(index, "type" , filteredQuery, 0, 5);
            Assert.AreEqual(2, result2.GetTotalCount());
            Assert.AreEqual(2, result2.GetHits().Hits.Count);
        }
		public void TestMatchAllQuery()
		{
			var filter = new TermFilter("gender", "true");//new TermsQuery("gender", "true", "false");
			var filterQuery = new FilteredQuery( new MatchAllQuery(),filter);
			var result = client.Search(index, "type" , filterQuery, 0, 5);
			Assert.AreEqual(50, result.GetTotalCount());
			Assert.AreEqual(5, result.GetHits().Hits.Count);

			var filter1 = new TermFilter("gender", "true");
			filterQuery = new FilteredQuery(new MatchAllQuery(), filter1);
			result = client.Search(index, "type" , filterQuery, 0, 5);
			Assert.AreEqual(50, result.GetTotalCount());
			Assert.AreEqual(5, result.GetHits().Hits.Count);
		}
		public void TestPrefixQuery()
		{
			var prefixQuery = new PrefixQuery("name", "张");
			var termFilter = new TermFilter("type", "common");
			var q = new FilteredQuery(prefixQuery,termFilter);
			var result = client.Search(index, "type" , q, 0, 5);

			Assert.AreEqual(3, result.GetTotalCount());

			prefixQuery = new PrefixQuery("name", "张三");
			termFilter = new TermFilter("type", "common");
			q = new FilteredQuery(prefixQuery, termFilter);
			result = client.Search(index, "type" , q, 0, 5);

			Assert.AreEqual(2, result.GetTotalCount());
		}
        public void TestNestedFilter()
        {
//    {
//    "name": "jackson",
//    "resume": {
//        "age": 22,
//        "gender": "male",
//        "mail": "*****@*****.**"
//    }
//}
            var obj = "{     \"type\": \"vip\", \"name\": \"jackson\",    \"resume\": {        \"age\": 22,        \"gender\": \"male\",        \"mail\": \"[email protected]\"    }}";
            var op= client.Index(index, "person", "key1", obj);
            Assert.True(op.Success);

            obj = "{     \"type\": \"vip\", \"name\": \"tom\",    \"resume\": {        \"age\": 24,        \"gender\": \"female\",        \"mail\": \"[email protected]\"    }}";
            op = client.Index(index, "person", "key2", obj);
            Assert.True(op.Success);
        	client.Refresh();
            var nestFilter = new NestedFilter("person", new TermQuery("resume.age", 22), true);

            var q = new FilteredQuery(new TermQuery("type","vip"), nestFilter);
            var result=client.Search(index, "person", q, 0, 5);
            Assert.AreEqual(1,result.GetTotalCount());
            Assert.AreEqual("jackson", result.GetHits().Hits[0].Source["name"]);
        
            
        }
        public void TestScriptFilter()
        {
            //age 23 24 25
            var query = new TermQuery("type", "common");
            var dict = new Dictionary<string, object>();
            dict["param1"] = 20;
            var filter = new ScriptFilter("doc['age'].value > param1",dict);
            var filterQ = new FilteredQuery(query, filter);
            var result= client.Search(index, "type" , filterQ, 0, 5);
            Assert.AreEqual(3,result.GetTotalCount());


            dict = new Dictionary<string, object>();
            dict["param1"] = 23;
            filter = new ScriptFilter("doc['age'].value > param1", dict);
            filterQ = new FilteredQuery(query, filter);
            result = client.Search(index, "type" , filterQ, 0, 5);
            Assert.AreEqual(2, result.GetTotalCount());

            dict = new Dictionary<string, object>();
            dict["param1"] = 24;
            filter = new ScriptFilter("doc['age'].value >= param1", dict);
            filterQ = new FilteredQuery(query, filter);
            result = client.Search(index, "type" , filterQ, 0, 5);
            Assert.AreEqual(2, result.GetTotalCount());

            dict = new Dictionary<string, object>();
            dict["param1"] = 25;
            filter = new ScriptFilter("doc['age'].value >= param1", dict);
            filterQ = new FilteredQuery(query, filter);
            result = client.Search(index, "type" , filterQ, 0, 5);
            Assert.AreEqual(1, result.GetTotalCount());

            dict = new Dictionary<string, object>();
            dict["param1"] = 25;
            filter = new ScriptFilter("doc['age'].value < param1", dict);
            filterQ = new FilteredQuery(query, filter);
            result = client.Search(index, "type" , filterQ, 0, 5);
            Assert.AreEqual(2, result.GetTotalCount());

            dict = new Dictionary<string, object>();
            dict["param1"] = 20;
            filter = new ScriptFilter("doc['age'].value < param1", dict);
            filterQ = new FilteredQuery(query, filter);
            result = client.Search(index, "type" , filterQ, 0, 5);
            Assert.AreEqual(0, result.GetTotalCount());
        }
        public void TestNotFilter()
        {
            var termFilter = new TermFilter("age", 24);
            var notFilter = new NotFilter(termFilter);

            var termQuery = new TermQuery("type", "common");

            var q = new FilteredQuery(termQuery, notFilter);

            var result2 = client.Search(index, "type" , q, 0, 5);
            Assert.AreEqual(2, result2.GetTotalCount());
            Assert.AreEqual(2, result2.GetHits().Hits.Count);
        }
        public void TestOrFilter()
        {
            var termFilter = new TermFilter("age", 24);
            var termFilter1 = new TermFilter("name", "张三丰");

            var orFilter = new OrFilter(termFilter,termFilter1);

            var termQuery = new TermQuery("type", "common");

            var q = new FilteredQuery(termQuery, orFilter);

            var result = client.Search(index, "type" , q, 0, 5);

            Assert.AreEqual(2, result.GetTotalCount());
        }
        public void TestAndFilter()
        {
            var termFilter = new TermFilter("age", 24);
//            var termFilter1 = new TermFilter("name", "张三");
            var andFilter = new AndFilter(termFilter);

            var termQuery = new TermQuery("type", "common");

            var q = new FilteredQuery(termQuery,andFilter);

            var result2 = client.Search(index, "type" , q, 0, 5);
            Assert.AreEqual(1, result2.GetTotalCount());
            Assert.AreEqual(1, result2.GetHits().Hits.Count);
            Assert.AreEqual("张三", result2.GetHits().Hits[0].Source["name"]);



            var constantQuery = new ConstantScoreQuery(andFilter);

            result2 = client.Search(index, "type" , constantQuery, 0, 5);
            Assert.AreEqual(1, result2.GetTotalCount());
            Assert.AreEqual(1, result2.GetHits().Hits.Count);
            Assert.AreEqual("张三", result2.GetHits().Hits[0].Source["name"]);

        }