嵌套Elasticsearch对象中的ID过滤

发布于 2025-02-13 07:53:57 字数 3462 浏览 0 评论 0原文

我正试图实现不常见的事情,而我正在努力挣扎。

我有这样的文档:

{
  "_index": "users",
  "_type": "_doc",
  "_id": "07e4588c-6102-4be2-9518-cabaa40726e0",
  "_score": 1,
  "_source": {
    "UserId": "07e4588c-6102-4be2-9518-cabaa40726e0",
...
    "UserField": [
      {
        "Id": "3fa8f6aa-e4d7-4762-9287-d53de515954a",
        "Value": "",
        "UserId": "07e4588c-6102-4be2-9518-cabaa40726e0",
        "FieldId": "3acca766-9f4a-4d7e-9ffb-262b7a26c971",
        "TenantKey": "b1ef9a58-bcbf-4069-ae4a-3efea1a51bba"
      },
      {
        "Id": "7b9219c7-4157-465c-9904-4e529cbf2f66",
        "Value": "Mason",
        "UserId": "07e4588c-6102-4be2-9518-cabaa40726e0",
        "FieldId": "f5f67cb3-c7e6-42a9-a299-06511240bda0",
        "TenantKey": "b1ef9a58-bcbf-4069-ae4a-3efea1a51bba"
      },
      {
        "Id": "b65ba0e9-64b7-4203-8ac1-0984dad642a5",
        "Value": "Alex",
        "UserId": "07e4588c-6102-4be2-9518-cabaa40726e0",
        "FieldId": "43bf99f4-20cf-48c3-9d09-d4488e9f0933",
        "TenantKey": "b1ef9a58-bcbf-4069-ae4a-3efea1a51bba"
      },
}
    ],
...
      }
    }
  }
}

正如您在这里看到的那样,我有一系列的用户字段,这是Elasticsearch中的嵌套对象。我的目标是按照该字段的值进行搜索,但是我需要特定的fieldID,并且在静态类中始终相同。

因此,在我的.NET代码中,我可以编写.. x.FieldId == fieldIds.firstname。是否有可能以某种方式获得搜索的优势,首先要过滤所需的字段,然后通过其value属性进行搜索。

我已经尝试了什么?

     var filters = new List<Func<QueryContainerDescriptor<UserSearchItem>, QueryContainer>>();
        
            filters.Add(fq => fq.Terms(t => t.Field(Infer.Field<UserSearchItem>(x => x.UserField.First(x => x.FieldId == FieldIds.Firstname)))));


            var searchResponse =
                _client.Search<UserSearchItem>(x => x.Query(q => q
                    .Nested(t => t
                        .Path(Infer.Field<UserSearchItem>(x => x.UserField))
                        .Query(q => q.Bool(f => f.Filter(filters))))));

没有运气

,这是运营商不使用的QueryContainer&amp;

  container &= new NestedQuery
            {
                Path = Infer.Field<UserSearchItem>(x => x.UserField),
                Query = new BoolQuery()
                {
                    Should = new List<QueryContainer>()
                    {
                        new MatchQuery()
                        {
                            Field =
                                Infer.Field<UserSearchItem>(x => x.UserField.First(x => x.FieldId == FieldIds.Firstname)).Name,
                            
                            Query = $"{req.Name}"
                        },
                        new MatchQuery()
                        {
                            Field =
                                Infer.Field<UserSearchItem>(x => x.UserField.First(x => x.FieldId == FieldIds.Lastname)).Name,
                            
                            Query = $"{req.Name}"
                        },
                        new MatchQuery()
                        {
                            Field =
                                Infer.Field<UserSearchItem>(x => x.UserField.First(x => x.FieldId == FieldIds.Middlename)).Name,
                            
                            Query = $"{req.Name}"
                        }
                    }
                }};

感谢提前的任何帮助!

I am trying to achieve not common thing and I am struggling with it hard.

I have such document:

{
  "_index": "users",
  "_type": "_doc",
  "_id": "07e4588c-6102-4be2-9518-cabaa40726e0",
  "_score": 1,
  "_source": {
    "UserId": "07e4588c-6102-4be2-9518-cabaa40726e0",
...
    "UserField": [
      {
        "Id": "3fa8f6aa-e4d7-4762-9287-d53de515954a",
        "Value": "",
        "UserId": "07e4588c-6102-4be2-9518-cabaa40726e0",
        "FieldId": "3acca766-9f4a-4d7e-9ffb-262b7a26c971",
        "TenantKey": "b1ef9a58-bcbf-4069-ae4a-3efea1a51bba"
      },
      {
        "Id": "7b9219c7-4157-465c-9904-4e529cbf2f66",
        "Value": "Mason",
        "UserId": "07e4588c-6102-4be2-9518-cabaa40726e0",
        "FieldId": "f5f67cb3-c7e6-42a9-a299-06511240bda0",
        "TenantKey": "b1ef9a58-bcbf-4069-ae4a-3efea1a51bba"
      },
      {
        "Id": "b65ba0e9-64b7-4203-8ac1-0984dad642a5",
        "Value": "Alex",
        "UserId": "07e4588c-6102-4be2-9518-cabaa40726e0",
        "FieldId": "43bf99f4-20cf-48c3-9d09-d4488e9f0933",
        "TenantKey": "b1ef9a58-bcbf-4069-ae4a-3efea1a51bba"
      },
}
    ],
...
      }
    }
  }
}

As you can see here, I have an array of UserFields and this is nested object in Elasticsearch. My goal is to search by Values of that fields, but I need particular FieldId and which always the same, described in static class.

So In my .NET code I can write ..x.FieldId == FieldIds.Firstname. Is it possible somehow to get an advantage of search, firstly filtering needed fields and then search by their Value property.

What I've already tried?

     var filters = new List<Func<QueryContainerDescriptor<UserSearchItem>, QueryContainer>>();
        
            filters.Add(fq => fq.Terms(t => t.Field(Infer.Field<UserSearchItem>(x => x.UserField.First(x => x.FieldId == FieldIds.Firstname)))));


            var searchResponse =
                _client.Search<UserSearchItem>(x => x.Query(q => q
                    .Nested(t => t
                        .Path(Infer.Field<UserSearchItem>(x => x.UserField))
                        .Query(q => q.Bool(f => f.Filter(filters))))));

No luck

And this one, even QueryContainer not applied by operator &

  container &= new NestedQuery
            {
                Path = Infer.Field<UserSearchItem>(x => x.UserField),
                Query = new BoolQuery()
                {
                    Should = new List<QueryContainer>()
                    {
                        new MatchQuery()
                        {
                            Field =
                                Infer.Field<UserSearchItem>(x => x.UserField.First(x => x.FieldId == FieldIds.Firstname)).Name,
                            
                            Query = 
quot;{req.Name}"
                        },
                        new MatchQuery()
                        {
                            Field =
                                Infer.Field<UserSearchItem>(x => x.UserField.First(x => x.FieldId == FieldIds.Lastname)).Name,
                            
                            Query = 
quot;{req.Name}"
                        },
                        new MatchQuery()
                        {
                            Field =
                                Infer.Field<UserSearchItem>(x => x.UserField.First(x => x.FieldId == FieldIds.Middlename)).Name,
                            
                            Query = 
quot;{req.Name}"
                        }
                    }
                }};

Thanks for any help in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

哭泣的笑容 2025-02-20 07:53:57

这是Plain JSON中的查询,

{
  "query" : {
     "nested" : {
        "path" : "UserField",
        "query" : {
           "bool" : {
                "must" : [
                   { 
                      "term" : {"UserField.FieldId" : Your_STATIC_FIELD}
                   },
                   { 
                      "term" :  {"UserField.Value" : "whatever_value_you_Want"}
                   }
                ]
           }
        }
     }
  }
}

首先在Kibana&gt中尝试此查询。 DevTools。如果获得所需的结果,请将其转换为.NET中的查询。您不需要任何非常复杂的东西就能使它起作用。它只是一个嵌套的布尔查询。

Hth。

Here is the query in plain json

{
  "query" : {
     "nested" : {
        "path" : "UserField",
        "query" : {
           "bool" : {
                "must" : [
                   { 
                      "term" : {"UserField.FieldId" : Your_STATIC_FIELD}
                   },
                   { 
                      "term" :  {"UserField.Value" : "whatever_value_you_Want"}
                   }
                ]
           }
        }
     }
  }
}

First try out this query in kibana > devTools. If you get the desired result, translate it into a query in .NET . You don't need anything very complicated to get this to work. Its just a nested bool query.

HTH.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文