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

}

相关推荐
平凡君8 分钟前
ElasticSearch查询指南:从青铜到王者的骚操作
大数据·elasticsearch·搜索引擎
songbaoxian14 分钟前
ElasticSearch
java·linux·elasticsearch
Dolphin_Home2 小时前
搭建 Hadoop 3.3.6 伪分布式
大数据·hadoop·分布式
Yvonne9782 小时前
Hadoop HDFS基准测试
大数据·hadoop·hdfs
Yvonne9782 小时前
Hadoop初体验
大数据·hadoop
易安杰4 小时前
ElasticSearch+Kibana通过Docker部署到Linux服务器中
linux·elasticsearch·搜索引擎·全文检索·中文分词
m0_748247554 小时前
重学SpringBoot3-整合 Elasticsearch 8.x (二)使用Repository
大数据·elasticsearch·jenkins
南宫文凯4 小时前
Hadoop-HA(高可用)机制
大数据·hadoop·分布式·hadoop-ha
乐享数科4 小时前
乐享数科:供应链金融—三个不同阶段的融资模式
大数据·人工智能·金融
程序员古德5 小时前
《论大数据处理架构及其应用》审题技巧 - 系统架构设计师
大数据·应用·论文写作·lambda架构·处理架构