elasticsearch中LessThen遇到的坑

开发中,使用到LessThen-小于某个参数的逻辑查询,如下:

cs 复制代码
/// <summary>
/// 查询状态已发布(状态小于2)的政策要闻分页
/// </summary>
/// <param name="input"></param>
/// <returns></returns>    
public async Task<PagedDto<PageSearchOutput>> GetPageSearchResultAsync(PageSearchInput input)
    {
        var elasticSearchManager = LazyServiceProvider.LazyGetRequiredService<IElasticSearchManager>();
        var searchRequest = new SearchRequest<PageIndex>(Nest.Indices.Parse(PageExtensionConsts.IndexName));
        searchRequest.Sort = new List<ISort> { new FieldSort { Field = Infer.Field<PageIndex>(d => d.CreationTime), Order = SortOrder.Descending } };

        var filterList = new List<QueryContainer>{
            new NumericRangeQuery(){
                Field = Infer.Field<PageIndex>(d => d.Status),
                LessThan = (byte)PageStatus.Revoked //小于2的查询出来
            }
        };

        if (input.IsEmpty())
            searchRequest.Query = new BoolQuery
            {
                Filter = filterList
            };
        else
        {
            var shouldList = new List<QueryContainer>();

            if (!input.QueryText.IsNullOrWhiteSpace())
            {
                var titleMatchQuery = new MatchQuery
                {
                    Field = Infer.Field<PageIndex>(d => d.Title),
                    Query = input.QueryText
                };
                var contentMatchQuery = new MatchQuery
                {
                    Field = Infer.Field<PageIndex>(d => d.Content),
                    Query = input.QueryText
                };
                shouldList.Add(titleMatchQuery);
                shouldList.Add(contentMatchQuery);
                searchRequest.Sort = new List<ISort> { new FieldSort { Field = "_score", Order = SortOrder.Descending } };
            }

            if (!input.Category.IsNullOrWhiteSpace())
            {
                filterList.Add(new TermQuery { Field = Infer.Field<PageIndex>(d => d.Category), Value = input.Category });
            }
            if (input.Province.HasValue)
            {
                filterList.Add(new TermQuery { Field = Infer.Field<PageIndex>(d => d.Province), Value = input.Province });
            }
            if (input.City.HasValue)
            {
                filterList.Add(new TermQuery { Field = Infer.Field<PageIndex>(d => d.City), Value = input.City });
            }
            var query = new BoolQuery
            {
                Should = shouldList,
                Filter = filterList
            };
            if (shouldList.Any())
            {
                query.MinimumShouldMatch = 1;
            }
            searchRequest.Query = query;
        }
        var queryDslJson = elasticSearchManager.GetQueryDslJson(searchRequest);

        var esResponse = await elasticSearchManager.SearchAsync<PageIndex>(
            searchRequest,
            (input.PageIndex - 1) * input.PageSize,
            input.PageSize);
        var pageIndices = esResponse.Documents;

        var ids = pageIndices.Select(i => i.Id).ToList();
        var qtos = await _queryRepository.GetPagesHitsAsync(ids);
        var outputs = pageIndices.Select(i =>
        {
            var areaIds = new List<int>();
            var area = string.Empty;
            areaIds.Add(i.Province);
            if (i.City.HasValue)
                areaIds.Add(i.City.Value);
            if (areaIds.Any())
                area = _queryRepository.GetAreaAsync(areaIds).Result;
            return new PageSearchOutput
            {
                Id = i.Id,
                Title = i.Title,
                Content = i.Content,
                CategoryName = PageCategory.FromValue(i.Category).DisplayName,
                TitlePicture = i.TitlePicture,
                CreationTime = i.CreationTime.ToDateTimeStr(),
                Status = ((PageStatus)i.Status).GetDescription(),
                Area = area,
                Hits = qtos.FirstOrDefault(qto => qto.Id == i.Id)?.Hits
            };
        });
        return new PagedDto<PageSearchOutput>(esResponse.Total, outputs.ToList());
    }

但是通过

var queryDslJson = elasticSearchManager.GetQueryDslJson(searchRequest);

转json得到的内容如下:LessThen后参数内容转义成2.0了,

这是因为LessThen是double?类型的,但是es中保存的2,所以导致查询出来的结果不是预期的,把状态=2的数据也查询出来了

cs 复制代码
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "status": {
              "lt": 2.0
            }
          }
        }
      ]
    }
  },
  "sort": [
    {
      "creationTime": {
        "order": "desc"
      }
    }
  ]
}

所以但是修改成

/// <summary>

/// 查询状态已发布(状态小于2)的政策要闻分页

/// </summary>

/// <param name="input"></param>

/// <returns></returns>

public async Task<PagedDto<PageSearchOutput>> GetPageSearchResultAsync(PageSearchInput input)

{

var elasticSearchManager = LazyServiceProvider.LazyGetRequiredService<IElasticSearchManager>();

var searchRequest = new SearchRequest<PageIndex>(Nest.Indices.Parse(PageExtensionConsts.IndexName));

searchRequest.Sort = new List<ISort> { new FieldSort { Field = Infer.Field<PageIndex>(d => d.CreationTime), Order = SortOrder.Descending } };

var filterList = new List<QueryContainer>{

//new NumericRangeQuery(){

// Field = Infer.Field<PageIndex>(d => d.Status),

// LessThan = (byte)PageStatus.Revoked

//}

new TermQuery { Field = Infer.Field<PageIndex>(d => d.Status), Value = (byte)PageStatus.Published } //使用TermQuery 来实现查询逻辑

};

double? tt = (byte)PageStatus.Revoked;

if (input.IsEmpty())

searchRequest.Query = new BoolQuery

{

Filter = filterList

};

else

{

var shouldList = new List<QueryContainer>();

if (!input.QueryText.IsNullOrWhiteSpace())

{

var titleMatchQuery = new MatchQuery

{

Field = Infer.Field<PageIndex>(d => d.Title),

Query = input.QueryText

};

var contentMatchQuery = new MatchQuery

{

Field = Infer.Field<PageIndex>(d => d.Content),

Query = input.QueryText

};

shouldList.Add(titleMatchQuery);

shouldList.Add(contentMatchQuery);

searchRequest.Sort = new List<ISort> { new FieldSort { Field = "_score", Order = SortOrder.Descending } };

}

if (!input.Category.IsNullOrWhiteSpace())

{

filterList.Add(new TermQuery { Field = Infer.Field<PageIndex>(d => d.Category), Value = input.Category });

}

if (input.Province.HasValue)

{

filterList.Add(new TermQuery { Field = Infer.Field<PageIndex>(d => d.Province), Value = input.Province });

}

if (input.City.HasValue)

{

filterList.Add(new TermQuery { Field = Infer.Field<PageIndex>(d => d.City), Value = input.City });

}

var query = new BoolQuery

{

Should = shouldList,

Filter = filterList

};

if (shouldList.Any())

{

query.MinimumShouldMatch = 1;

}

searchRequest.Query = query;

}

var queryDslJson = elasticSearchManager.GetQueryDslJson(searchRequest);

var esResponse = await elasticSearchManager.SearchAsync<PageIndex>(

searchRequest,

(input.PageIndex - 1) * input.PageSize,

input.PageSize);

var pageIndices = esResponse.Documents;

var ids = pageIndices.Select(i => i.Id).ToList();

var qtos = await _queryRepository.GetPagesHitsAsync(ids);

var outputs = pageIndices.Select(i =>

{

var areaIds = new List<int>();

var area = string.Empty;

areaIds.Add(i.Province);

if (i.City.HasValue)

areaIds.Add(i.City.Value);

if (areaIds.Any())

area = _queryRepository.GetAreaAsync(areaIds).Result;

return new PageSearchOutput

{

Id = i.Id,

Title = i.Title,

Content = i.Content,

CategoryName = PageCategory.FromValue(i.Category).DisplayName,

TitlePicture = i.TitlePicture,

CreationTime = i.CreationTime.ToDateTimeStr(),

Status = ((PageStatus)i.Status).GetDescription(),

Area = area,

Hits = qtos.FirstOrDefault(qto => qto.Id == i.Id)?.Hits

};

});

return new PagedDto<PageSearchOutput>(esResponse.Total, outputs.ToList());

}

相关推荐
@月落7 分钟前
alibaba获得店铺的所有商品 API接口
java·大数据·数据库·人工智能·学习
码爸1 小时前
spark读mongodb
大数据·mongodb·spark
WPG大大通1 小时前
有奖直播 | onsemi IPM 助力汽车电气革命及电子化时代冷热管理
大数据·人工智能·汽车·方案·电气·大大通·研讨会
ws2019071 小时前
抓机遇,促发展——2025第十二届广州国际汽车零部件加工技术及汽车模具展览会
大数据·人工智能·汽车
Data-Miner2 小时前
196页满分PPT | 集团流程优化及IT规划项目案例
大数据·数据分析
徐*红2 小时前
Elasticsearch 8.+ 版本查询方式
大数据·elasticsearch
DolphinScheduler社区2 小时前
怎么办?用DolphinScheduler调度执行复杂的HiveSQL时无法正确识别符号
大数据
goTsHgo2 小时前
Hive自定义函数——简单使用
大数据·hive·hadoop
码爸2 小时前
flink 例子(scala)
大数据·elasticsearch·flink·scala
FLGB2 小时前
Flink 与 Kubernetes (K8s)、YARN 和 Mesos集成对比
大数据·flink·kubernetes