DSL查询以从多个键的字典数组中查找元素
DSL query to find the elements from array of dictionaries on multiple keys
我在弹性搜索中有一个名为 professor
的索引
如果对于交叉字段我需要“AND”条件
对于相同的字段数组,我需要 OR 条件
- 我需要搜索
BusinessArea
这是 Research
或 Accounting
这是字段数组 (OR) 语句
1.a BusinessArea
必须签入 name
以及 parentname
和
我需要搜索 Role
是 Developer
或 Tester
条件这是字段数组 (OR) 语句
和
我要搜索Location
是NY
(&)条件
test=[ { 'id': '1', 'name': 'Group1', 'BusinessArea': [ { 'id': '14', 'name': 'Accounting', 'parentname': 'Finance'}, { 'id': '3', 'name': 'Research', 'parentname': 'R & D' } ], 'Designation': [ { 'id': '16', 'name': 'L1' }, { 'id': '20', 'name': 'L2' }, { 'id': '25', 'name': 'L2' }, ] }, { 'id': '2', 'name': 'Group1', 'BusinessArea': [ { 'id': '14', 'name': 'Research', 'parentname': '' }, { 'id': '3', 'name': 'Accounting', 'parentname': '' } ], 'Role': [ { 'id': '5032', 'name': 'Tester' }, { 'id': '5033', 'name': 'Developer' } ], 'Designation': [ { 'id': '16', 'name': 'L1' }, { 'id': '20', 'name': 'L2' }, { 'id': '25', 'name': 'L2' }, ] }, { 'id': '1', 'name': 'Group1', 'BusinessArea': [ { 'id': '14', 'name': 'Research' }, { 'id': '3', 'name': 'Engineering', 'parentname': '' } ], 'Role': [ { 'id': '5032', 'name': 'Developer' }, { 'id': '5033', 'name': 'Developer', 'parentname': '' } ], 'Designation': [ { 'id': '16', 'name': 'L1' }, { 'id': '20', 'name': 'L2' }, { 'id': '25', 'name': 'L2' } ] } ]
查询如下,除了
#1.a
content_search = es.search(index="professor", body={
"query": {
"bool": {
"must": [
{
"terms":
{
"BusinessArea.name.keyword": ["Research","Accounting"]
}
},
{
"terms":
{
"Role.name.keyword": ["Developer","Tested"]
}
}
]
},
"filter": [
{
"term": {
"Location.keyword": "NY"
}
}
]
}
})
您可以使用 multi-match query, with a combination of the bool query
以下搜索查询适用于您的 1(A) 条件,它在 BusinessArea.name
AND [=15 中搜索 (Research
OR Accounting
) =] 字段
搜索查询:
{
"query": {
"bool": {
"must": [
{
"bool": {
"should": [
{
"multi_match": {
"query": "Research",
"fields": [
"BusinessArea.name.keyword",
"BusinessArea.parentname.keyword"
]
}
},
{
"multi_match": {
"query": "Accounting",
"fields": [
"BusinessArea.name.keyword",
"BusinessArea.parentname.keyword"
]
}
}
]
}
},
{
"terms": {
"Role.name.keyword": [
"Developer",
"Tester"
]
}
}
]
}
}
}
搜索结果:
"hits": [
{
"_index": "64572999",
"_type": "_doc",
"_id": "2",
"_score": 1.7587298,
"_source": {
"id": "2",
"name": "Group1",
"BusinessArea": [
{
"id": "14",
"name": "Research",
"parentname": ""
},
{
"id": "3",
"name": "Accounting",
"parentname": ""
}
],
"Role": [
{
"id": "5032",
"name": "Tester"
},
{
"id": "5033",
"name": "Developer"
}
],
"Designation": [
{
"id": "16",
"name": "L1"
},
{
"id": "20",
"name": "L2"
},
{
"id": "25",
"name": "L2"
}
]
}
},
{
"_index": "64572999",
"_type": "_doc",
"_id": "3",
"_score": 1.167868,
"_source": {
"id": "1",
"name": "Group1",
"BusinessArea": [
{
"id": "14",
"name": "Research"
},
{
"id": "3",
"name": "Engineering",
"parentname": ""
}
],
"Role": [
{
"id": "5032",
"name": "Developer"
},
{
"id": "5033",
"name": "Developer",
"parentname": ""
}
],
"Designation": [
{
"id": "16",
"name": "L1"
},
{
"id": "20",
"name": "L2"
},
{
"id": "25",
"name": "L2"
}
]
}
}
]
我在弹性搜索中有一个名为 professor
如果对于交叉字段我需要“AND”条件
对于相同的字段数组,我需要 OR 条件
- 我需要搜索
BusinessArea
这是Research
或Accounting
这是字段数组 (OR) 语句
1.a BusinessArea
必须签入 name
以及 parentname
和
我需要搜索
Role
是Developer
或Tester
条件这是字段数组 (OR) 语句和
我要搜索
Location
是NY
(&)条件
test=[ { 'id': '1', 'name': 'Group1', 'BusinessArea': [ { 'id': '14', 'name': 'Accounting', 'parentname': 'Finance'}, { 'id': '3', 'name': 'Research', 'parentname': 'R & D' } ], 'Designation': [ { 'id': '16', 'name': 'L1' }, { 'id': '20', 'name': 'L2' }, { 'id': '25', 'name': 'L2' }, ] }, { 'id': '2', 'name': 'Group1', 'BusinessArea': [ { 'id': '14', 'name': 'Research', 'parentname': '' }, { 'id': '3', 'name': 'Accounting', 'parentname': '' } ], 'Role': [ { 'id': '5032', 'name': 'Tester' }, { 'id': '5033', 'name': 'Developer' } ], 'Designation': [ { 'id': '16', 'name': 'L1' }, { 'id': '20', 'name': 'L2' }, { 'id': '25', 'name': 'L2' }, ] }, { 'id': '1', 'name': 'Group1', 'BusinessArea': [ { 'id': '14', 'name': 'Research' }, { 'id': '3', 'name': 'Engineering', 'parentname': '' } ], 'Role': [ { 'id': '5032', 'name': 'Developer' }, { 'id': '5033', 'name': 'Developer', 'parentname': '' } ], 'Designation': [ { 'id': '16', 'name': 'L1' }, { 'id': '20', 'name': 'L2' }, { 'id': '25', 'name': 'L2' } ] } ]
查询如下,除了
#1.a
content_search = es.search(index="professor", body={
"query": {
"bool": {
"must": [
{
"terms":
{
"BusinessArea.name.keyword": ["Research","Accounting"]
}
},
{
"terms":
{
"Role.name.keyword": ["Developer","Tested"]
}
}
]
},
"filter": [
{
"term": {
"Location.keyword": "NY"
}
}
]
} })
您可以使用 multi-match query, with a combination of the bool query
以下搜索查询适用于您的 1(A) 条件,它在 BusinessArea.name
AND [=15 中搜索 (Research
OR Accounting
) =] 字段
搜索查询:
{
"query": {
"bool": {
"must": [
{
"bool": {
"should": [
{
"multi_match": {
"query": "Research",
"fields": [
"BusinessArea.name.keyword",
"BusinessArea.parentname.keyword"
]
}
},
{
"multi_match": {
"query": "Accounting",
"fields": [
"BusinessArea.name.keyword",
"BusinessArea.parentname.keyword"
]
}
}
]
}
},
{
"terms": {
"Role.name.keyword": [
"Developer",
"Tester"
]
}
}
]
}
}
}
搜索结果:
"hits": [
{
"_index": "64572999",
"_type": "_doc",
"_id": "2",
"_score": 1.7587298,
"_source": {
"id": "2",
"name": "Group1",
"BusinessArea": [
{
"id": "14",
"name": "Research",
"parentname": ""
},
{
"id": "3",
"name": "Accounting",
"parentname": ""
}
],
"Role": [
{
"id": "5032",
"name": "Tester"
},
{
"id": "5033",
"name": "Developer"
}
],
"Designation": [
{
"id": "16",
"name": "L1"
},
{
"id": "20",
"name": "L2"
},
{
"id": "25",
"name": "L2"
}
]
}
},
{
"_index": "64572999",
"_type": "_doc",
"_id": "3",
"_score": 1.167868,
"_source": {
"id": "1",
"name": "Group1",
"BusinessArea": [
{
"id": "14",
"name": "Research"
},
{
"id": "3",
"name": "Engineering",
"parentname": ""
}
],
"Role": [
{
"id": "5032",
"name": "Developer"
},
{
"id": "5033",
"name": "Developer",
"parentname": ""
}
],
"Designation": [
{
"id": "16",
"name": "L1"
},
{
"id": "20",
"name": "L2"
},
{
"id": "25",
"name": "L2"
}
]
}
}
]