当我试图将动态嵌套对象添加到filter中时,我遇到了一个问题.我的查询在Kibana中运行得很好,但是当我把它翻译成代码(我使用的是Elastic.Clients.Elasticsearch v8.11.0)时,最后一个嵌套对象覆盖了第一个.对象是使用调用GetFacetNestedScope函数的foreach循环插入的.

这是我的Kibana查询:

{
  "size": 2000, 
  "query": {
    "bool": {
      "should": [
        { "match": { "description.title": { "query": "borsa termica", "prefix_length": 1, "fuzziness": "AUTO", "_name": "title" } } },
        { "match": { "description.longDescription": { "query": "borsa termica", "prefix_length": 1, "fuzziness": "AUTO", "_name": "longDescription" } } },
        { "match": { "options.code": { "query": "borsa termica", "prefix_length": 1, "fuzziness": "AUTO", "_name": "code" } } }
      ],
      "filter": [
        {
          "nested": {
            "_name": "MARCA_guzzini",
            "path": "erpAttributes",
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "erpAttributes.erpId": {
                      "value": "MARCA"
                    }
                    }
                  },
                  {
                    "nested": {
                      "path": "erpAttributes.values",
                      "query": {
                        "term": {
                          "erpAttributes.values.id": {
                          "value": "guzzini"
                        }
                        }
                      }
                    }
                  }
                ]
              }
            }
          }
        },
         {
          "nested": {
            "_name": "colore_bianco",
            "path": "erpAttributes",
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "erpAttributes.erpId": {
                      "value": "COL"
                    }
                    }
                  },
                  {
                    "nested": {
                      "path": "erpAttributes.values",
                      "query": {
                        "term": {
                          "erpAttributes.values.id": {
                          "value": "bianco"
                        }
                        }
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "attributi_unici": {
      "nested": {
        "path": "erpAttributes"
      },
      "aggs": {
        "nomi_attributi": {
          "terms": {
            "field": "erpAttributes.name",
            "size": 10
          },
          "aggs": {
            "valori_unici": {
              "nested": {
                "path": "erpAttributes.values"
              },
              "aggs": {
                
                "id_valori": {
                  "terms": {
                    "field": "erpAttributes.values.id",
                    "size": 10
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

这是我的代码(所有的代码都是GetQueryFunction):

public static QueryDescriptor<Product> GetQuery(QueryDescriptor<Product> q, IEnumerable<Facet> facets, string searchTerm, string categorySlug)
{
    return q
        .Bool(b =>
        {
            if (!string.IsNullOrWhiteSpace(categorySlug))
            {
                b.Must(mu => mu
                    .Term(t => t.Field(f => f.Categories.First().Id.Suffix(Constants.ElasticSearch.SuffixKeyword))
                        .Value(categorySlug)));
            }

            if (!string.IsNullOrWhiteSpace(searchTerm))
            {
                b.Should(
                    sh => GetSearchTermMatchScope(sh, searchTerm,
                        Constants.ElasticSearch.SearchTermFields.Title),
                    sh => GetSearchTermMatchScope(sh, searchTerm,
                        Constants.ElasticSearch.SearchTermFields.LongDescription),
                    sh => GetSearchTermMatchScope(sh, searchTerm,
                        Constants.ElasticSearch.SearchTermFields.Code)
                );
            }

            if (facets != null && facets.Any())
            {
                b.Filter(f =>
                {
                    foreach (var facet in facets)
                    {
                        GetFacetNastedScope(f, facet);
                    }
                });
            }
        });
}

public static QueryDescriptor<Product> GetFacetNastedScope(QueryDescriptor<Product> f, Facet facet)
{
    return f.Nested(n => n
        .QueryName(facet.Name)
        .Path(Constants.ElasticSearch.ProductFacetsNastedFields.ErpAttributes)
        .Query(qu => qu
            .Bool(nb => nb
                .Must(m => m
                        .Term(t => t
                            .Field(Constants.ElasticSearch.ProductFacetsNastedFields.ErpAttributesErpId)
                            .Value(facet.Name)
                        ), m => m
                        .Nested(nn => nn
                            .Path(Constants.ElasticSearch.ProductFacetsNastedFields.ErpAttributesValues)
                            .Query(nnq => nnq
                                .Term(t => t
                                    .Field(Constants.ElasticSearch.ProductFacetsNastedFields.ErpAttributesValuesId)
                                    .Value(facet.Value)))
                        )
                )
            )
        )
    );
}

这个nuget包的新版本的文档丢失了,其他帖子也没有解决这个问题. 为什么结果不同?我的代码中缺少了什么?

推荐答案

创建一个过滤器描述符列表,而不是try 在单个过滤器描述符中初始化多个子查询:

if (facets != null && facets.Any())
{
    var filterDescriptors = new List<Action<QueryDescriptor<Product>>>();

    foreach (var facet in facets)
    {
        filterDescriptors.Add(f => GetFacetNastedScope(f, facet));
    }

    b.Filter(filterDescriptors.ToArray());
}

Csharp相关问答推荐

C# Json重新初始化动态类型

HttpContext. RequestAborted当Android APP失go 连接时未取消

. NET WireMock拒绝PostAsJsonAsync序列化

将XPS转换为PDF C#

如何在没有前缀和可选后缀的情况下获取Razor Page Handler方法名称?

在具有不同属性名称的两个类之间创建关系

C# CompareTo()和Compare()可以返回除-1和1以外的整数吗?

在C#中,非静态接口方法的抽象和虚拟是冗余的吗?

Lambda表达式如何与隐式强制转换一起工作?

在.NET 8最低API中从表单绑定中排除属性

在两个已具有一对多关系的表之间添加另一个一对多关系

有没有更好的方法来在CosmosDB上插入非id?

在扩展方法中,IEnumerable<;T>;不会转换为IEumerable<;T&>

用于ASP.NET核心的最小扩展坞

如何使用类似于[SELECT*FROM&Q;&Q;WHERE&Q;]SQL查询的System.Data.Entity创建查询?

使DefaultIfEmpty返回空

使用C#12中的主构造函数进行空判断

HttpClient,上传文件时实现进度

使用Try-Catch-Finally为API端点处理代码--有什么缺点?

XmlSerializer在遇到XML属性(命名空间)时崩溃