開發中,使用到LessThen-小于某個參數的邏輯查詢,如下:
/// <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的數據也查詢出來了
{"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());
??? }