假设我的用户使用以下文档编制索引:
{
"name": "Fred Jonsson",
"age": 24,
"emails": [
{
"active": false,
"address": "fred.jonsson@burnabyhighschool.ca",
},
{
"active": false,
"address": "fjonsson4@kpu.ca",
},
{
"active": true,
"address": "fred@engineeringcorp.com",
},
{
"active": false,
"address": "fred@jonsson.me",
},
}
}
ElasticSearch DSL 是否允许我构建一个查询,我可以通过他们的电子邮件地址搜索人员,但前提是该地址是否有效?在更抽象的术语中,嵌套对象搜索文档取决于这些对象的其他属性。
符合此条件的搜索会返回此文档以搜索"fred@jonsson.me"
或"engineeringcorp.com"
,但在搜索"fred.jonsson@burnabyhighschool.ca"
时不会返回此文档。
答案 0 :(得分:1)
是的,您只需要对文档启动嵌套查询。在您的映射中,您需要设置"电子邮件" as"键入":"嵌套"。这将创建"隐藏"数组中与此父文档关联的每个对象的文档。
{
"query": {
"nested": {
"path": "emails",
"query": {
"bool": {
"must": [
{
"term": {
"active": {
"value": "true"
}
}
},
{
"match": {
"address": "fred@jonsson.me"
}
}
]
}
}
}
}
}
答案 1 :(得分:1)
例如,如果您要搜索email: fred.jonsson@burnabyhighschool.ca
active
,则可以执行以下操作:
{
query: {
nested: {
path: 'emails',
query: {
bool: {
must: [
{
term: {
'emails.active': true
}
},
{
term: {
'emails.address': "fred.jonsson@burnabyhighschool.ca"
}
}
]
}
}
}
}
}