日常的生产中我们不可避免的会涉及到动态构建es的查询条件的场景,本文将展开这方面的demo
https://stackoverflow.com/questions/64902916/dynamic-elastic-search-query-in-c-sharp-nest
https://www.elastic.co/guide/en/elasticsearch/client/net-api/7.17/constant-score-query-usage.html
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Nest;
using Elasticsearch.Net;
using EsHelper.Model;
namespace EsHelper
{
public class EsTool
{
public ElasticClient _elasticClient { get; set; }
public EsTool()
{
var pool = new SingleNodeConnectionPool(new Uri("http://192.168.214.131:9200"));
var setting = new ConnectionSettings(pool).BasicAuthentication("elastic","ellischen");
_elasticClient = new ElasticClient(setting);
}
public QueryContainer[] dynamicMust()
{
QueryContainer orQuery = null;
List<QueryContainer> queryContainerList = new List<QueryContainer>();
//orQuery = new TermQuery() { Field = "title" ,Value= "Android in Action, Second Edition" };
//queryContainerList.Add(orQuery);
orQuery = new LongRangeQuery() { Field = "pageCount", GreaterThanOrEqualTo = 2 };
queryContainerList.Add(orQuery);
return queryContainerList.ToArray();
}
public QueryContainer[] dynamicShould()
{
QueryContainer orQuery = null;
List<QueryContainer> queryContainerList = new List<QueryContainer>();
orQuery = new TermQuery() { Field = "title.keyword" ,Value= "Android in Action, Second Edition" };
queryContainerList.Add(orQuery);
orQuery = new PrefixQuery() { Field = "title", Value = "S" };
queryContainerList.Add(orQuery);
return queryContainerList.ToArray();
}
public QueryContainer BookShould()
{
return new QueryContainerDescriptor<Books>().Bool(
b => b.Should(
dynamicShould()));
}
public QueryContainer BookMust()
{
return new QueryContainerDescriptor<Books>().Bool(
b => b.Must(
dynamicMust()));
}
public void test()
{
var searchRequest = new SearchRequest<Books>("books")
{
Query = new BoolQuery()
{
Must = dynamicMust(),
Should = dynamicShould(),
MinimumShouldMatch = 1
},
Size=10000
};
var vv = _elasticClient.Search<Books>(searchRequest);
}
public void testConstantScoreQuery()
{
var searchRequest = new SearchRequest<Books>("books")
{
Query = new ConstantScoreQuery()
{
Filter = new BoolQuery()
{
Must = dynamicMust(),
Should = dynamicShould(),
MinimumShouldMatch = 1
}
},
Size = 10000
};
var vv = _elasticClient.Search<Books>(searchRequest);
}
}
}