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());

}

相关推荐
A 计算机毕业设计-小途8 分钟前
大四零基础用Vue+ElementUI一周做完化妆品推荐系统?
java·大数据·hadoop·python·spark·毕业设计·毕设
君不见,青丝成雪4 小时前
Flink双流join
大数据·数据仓库·flink
好好先森&6 小时前
Linux系统:C语言进程间通信信号(Signal)
大数据
EkihzniY6 小时前
结构化 OCR 技术:破解各类检测报告信息提取难题
大数据·ocr
吱吱企业安全通讯软件6 小时前
吱吱企业通讯软件保证内部通讯安全,搭建数字安全体系
大数据·网络·人工智能·安全·信息与通信·吱吱办公通讯
云手机掌柜6 小时前
Tumblr长文运营:亚矩阵云手机助力多账号轮询与关键词布局系统
大数据·服务器·tcp/ip·矩阵·流量运营·虚幻·云手机
rainFFrain8 小时前
Boost搜索引擎项目(详细思路版)
网络·c++·http·搜索引擎
Hello.Reader9 小时前
Elasticsearch Ruby 客户端安装与版本兼容指南
elasticsearch·jenkins·ruby
拓端研究室9 小时前
专题:2025全球消费趋势与中国市场洞察报告|附300+份报告PDF、原数据表汇总下载
大数据·信息可视化·pdf