如果嵌套数组包含值,则获取所有对象-ElasticSearch

时间:2018-06-21 16:37:03

标签: c# .net elasticsearch

如果嵌套列表包含来自另一个数组的值,我想返回对象的列表。 例如:

{
  "ListOfMainObject": [
      {
          "Name": "Object1",
          "NestedArray": [
             "Value1",
             "Value2"
          ]
      },
      {
          "Name": "Object2",
          "NestedArray": [
             "Value1",
             "Value3"
          ]
      },
      {
          "Name": "Object3",
          "NestedArray": [
             "Value2",
             "Value3"
          ]
      }
]}

,如果我有一个数组,例如[“ Value1”],它应该返回Object1和Object2的列表。另外,如果我有数组[“ Value1”,“ Value2”],它应该只返回Object1,因为只有Object1包含这些值。

当前,我具有用于设置此查询的过滤器功能,但是如果我在数组中发送两个值,则此功能将排除在外:

private List<Func<QueryContainerDescriptor<Unit>, QueryContainer>> GetFacetFilters(IList<string> facets)
    {
        var filters = new List<Func<QueryContainerDescriptor<Unit>, QueryContainer>>();

        if (facets == null)
        {
            return filters;
        }

        foreach (var facet in facets)
        {
            QueryContainer Filter(QueryContainerDescriptor<Unit> f) => f
                .Bool(bo => bo
                    .Must(m => m.MatchPhrase(md => md.Field(new Field("facets.visible")).Query("true")))
                    .Should(s => s.MatchPhrase(md => md.Field(new Field("facets.alias")).Query(facet))));

            filters.Add(Filter);
        }

        return filters;
    }

'Unit'是主要对象,'Facets'是嵌套数组。

谢谢!

P.S。 .net弹性搜索

1 个答案:

答案 0 :(得分:0)

您的示例数据似乎是一个JSON集合,但是您已经提供了c#和.net标记,因此我认为在某些时候您可以对一组c#对象进行操作。

使用LINQ,您可以返回MainObjects的子集,其NestedArray属性包含一个单独的Array的所有值,如下所示:

List<MainObject> mainObjectList = {...} // object collection
var requiredValues = {...} // e.g. ["Value1", "Value2"];

mainObjectList.Where(x => !requiredValues.Except(x.NestedArray).Any());