我通过点击复选框过滤搜索查询。我有不同的复选框。全部使用相同的功能来添加和删除我的查询版本。 我将值存储在数组中,并格式化它们以进行查询。
我正在使用Elasticsearch进行查询和angular7。
onChangeLocations(value: string, checked: boolean) {
if (checked) {
this.selectedLocations.push(value);
this.selectedTopics.push({
'match_phrase': { '134_facet_locations': value },
});
this.selectedTopics.push({
'match_phrase': { '135_facet_locations': value },
});
this.selectedTopics.push({
'match_phrase': { '136_facet_locations': value },
});
} else {
this.selectedTopics = this.selectedTopics.filter((topic: any) => {
return topic.match_phrase['134_facet_locations'] !== value;
});
this.selectedTopics = this.selectedTopics.filter((topic: any) => {
return topic.match_phrase['135_facet_locations'] !== value;
});
this.selectedTopics = this.selectedTopics.filter((topic: any) => {
return topic.match_phrase['136_facet_locations'] !== value;
});
this.selectedLocations = this.selectedLocations.filter((facet: any) => {
return facet !== value;
});
}
}
这是我的输出,适用于OR查询。
[
{
"bool": {
"should": [
{
"match_phrase": {
"134_facet_locations": "Deutschland"
}
},
{
"match_phrase": {
"135_facet_locations": "Deutschland"
}
},
{
"match_phrase": {
"136_facet_locations": "Deutschland"
}
},
{
"match_phrase": {
"134_facet_locations": "Basel"
}
},
{
"match_phrase": {
"135_facet_locations": "Basel"
}
},
{
"match_phrase": {
"136_facet_locations": "Basel"
}
}
]
}
}
]
我需要一个输出,查询必须如下所示:
{
"should": [
{
"bool": {
"should": [
{
"match_phrase": {
"134_facet_locations": "Basel"
}
},
{
"match_phrase": {
"135_facet_locations": "Basel"
}
},
{
"match_phrase": {
"136_facet_locations": "Basel"
}
}
]
}
},
{
"bool": {
"should": [
{
"match_phrase": {
"134_facet_locations": "Deutschland"
}
},
{
"match_phrase": {
"135_facet_locations": "Deutschland"
}
},
{
"match_phrase": {
"136_facet_locations": "Deutschland"
}
}
]
}
}
]
}
我知道如何将它们一次添加到数组中。但是我不知道如何以一种很好的方式构建这个复杂的json查询。
答案 0 :(得分:0)
这是我对答案的建议。我必须检查值是否更改。如果更改,则将主题添加到新的“布尔应”数组中。像这样的东西。