嵌套Elasticsearch对象中的ID过滤
我正试图实现不常见的事情,而我正在努力挣扎。
我有这样的文档:
{
"_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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是Plain JSON中的查询,
首先在Kibana&gt中尝试此查询。 DevTools。如果获得所需的结果,请将其转换为.NET中的查询。您不需要任何非常复杂的东西就能使它起作用。它只是一个嵌套的布尔查询。
Hth。
Here is the query in plain json
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.