我的ElasticSearch文档包含一个 nested 表单域集合。每个字段都有一个名称和一个值,并且映射如下:
form: {
properties: {
id: { type: 'integer' },
name: { type: 'text' },
form_data: {
type: 'nested',
properties: {
'name': { type: 'keyword' },
'value': { type: 'text', analyzer: 'full_text_analyzer' }
}
}
}
}
我需要允许用户搜索多个表单字段以完善他们的搜索。他们可以选择要搜索的字段,并为每个字段分配一个值。例如
applicant_name = 'Joe'
pet_type = 'dog'
这将找到所有包含名称为applicant_name
且具有值模糊匹配Joe
的字段以及名为pet_type
和具有值模糊匹配dog
的字段的所有文档
我正在尝试使用的查询如下:
{
"query": {
"bool": {
"must": [{
"nested": {
"path": "form_data",
"query": {
"filter": {
"bool": {
"must": [
{
"bool": {
"must": [
{ "term": { "form_data.name": "applicant_name" } },
{ "match": { "form_data.value": "Joe" } }
]
}
},
{
"bool": {
"must": [
{ "term": { "form_data.name": "pet_type" } },
{ "match": { "form_data.value": "dog" } }
]
}
}
]
}
}
}
}
}]
}
}
}
但是,我得到0个结果。
答案 0 :(得分:1)
尝试在您的初始“必须”子句中按条件使用嵌套查询:
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "form_data",
"query": {
"bool": {
"must": [
{ "term": { "form_data.name": "applicant_name" } },
{ "match": { "form_data.value": "Joe" } }
]
}
}
}
},
{
"nested": {
"path": "form_data",
"query": {
"bool": {
"must": [
{ "term": { "form_data.name": "pet_type" } },
{ "match": { "form_data.value": "dog" } }
]
}
}
}
}
]
}
}
}