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

}

相关推荐
StarRocks_labs8 小时前
从InfluxDB到StarRocks:Grab实现Spark监控平台10倍性能提升
大数据·数据库·starrocks·分布式·spark·iris·物化视图
若兰幽竹9 小时前
【Spark分析HBase数据】Spark读取并分析HBase数据
大数据·spark·hbase
R²AIN SUITE9 小时前
金融合规革命:R²AIN SUITE 如何重塑银行业务智能
大数据·人工智能
绿算技术10 小时前
“强强联手,智启未来”凯创未来与绿算技术共筑高端智能家居及智能照明领域新生态
大数据·人工智能·智能家居
只因只因爆11 小时前
spark的缓存
大数据·缓存·spark
Leo.yuan12 小时前
3D 数据可视化系统是什么?具体应用在哪方面?
大数据·数据库·3d·信息可视化·数据分析
只因只因爆12 小时前
spark小任务
大数据·分布式·spark
cainiao08060512 小时前
Java 大视界——Java 大数据在智慧交通智能停车诱导系统中的数据融合与实时更新
java·大数据·开发语言
End92815 小时前
Spark之搭建Yarn模式
大数据·分布式·spark
我爱写代码?15 小时前
Spark 集群配置、启动与监控指南
大数据·开发语言·jvm·spark·mapreduce