如何修改C#代码将Elasticsearch BoolQuery的Filter改为非数组结构
如何修改Nest代码使BoolQuery的Filter为单个查询而非数组(保留对象初始化语法)
现有以下Nest代码,生成的Elasticsearch请求中,bool.filter是数组格式:
using System.Collections.Generic; using Elasticsearch.Net; using Nest; public void MyTest() { QueryBase query = new TermQuery { Field = Infer.Field<MyDocument>(f => f.Title), Value = "MyTitle" }; var booleanQuery = new BoolQuery(); var containers = new List<QueryContainer> { query }; booleanQuery.Filter = containers; var request = new SearchRequest<MyDocument>("MyIndex") { Query = booleanQuery }; var elasticClient = new ElasticClient(); var s = elasticClient.RequestResponseSerializer.SerializeToString(request, SerializationFormatting.Indented); }
生成的JSON请求:
{ "query": { "bool": { "filter": [{ "term": { "title": { "value": "MyTitle" } } } ] } } }
现在需要将filter改为单个查询对象,期望的JSON格式如下:
{ "query": { "bool": { "filter": { "term": { "title": { "value": "MyTitle" } } } } } }
修改方案
Nest的BoolQuery.Filter属性类型为QueryContainer,它支持直接赋值单个查询对象(无需包装成集合)。直接去掉List的创建,将单个TermQuery赋值给Filter即可,同时保留对象初始化语法:
修改后的完整代码:
using Elasticsearch.Net; using Nest; public void MyTest() { QueryContainer query = new TermQuery { Field = Infer.Field<MyDocument>(f => f.Title), Value = "MyTitle" }; var booleanQuery = new BoolQuery { Filter = query }; var request = new SearchRequest<MyDocument>("MyIndex") { Query = booleanQuery }; var elasticClient = new ElasticClient(); var s = elasticClient.RequestResponseSerializer.SerializeToString(request, SerializationFormatting.Indented); }
说明
- 将
query的类型改为QueryContainer(也可利用隐式转换直接赋值,TermQuery继承自QueryBase,QueryContainer支持隐式接收QueryBase实例) - 直接在
BoolQuery的对象初始化器中给Filter赋值单个查询对象,无需创建集合 - 这样序列化后的JSON中,
filter就会是单个对象而非数组
内容的提问来源于stack exchange,提问作者huha
相关产品推荐
相关产品推荐

