所以我们得到了一个弹性搜索实例,但是一项工作需要进行组合搜索" (单个搜索字段,在特定索引中包含types
的复选框)
这很好,我只是将这种搜索应用于我的索引(为了简洁:/ posts):
{
"query": {
"multi_match": {
"query": querystring,
"type":"cross_fields",
"fields":["title","name"]
}
}
}
}
正如您可能从这里对multi_match的需求所猜测的那样,每种类型的模式都有这样或那样的不同。这就是我现在面临的挑战。
在其中一种类型中,只有一种,有一个字段在其他类型中不存在,它被称为active
,它是一个基本的布尔值0或1.
我们希望为管理搜索目的索引类型中的非活动项目,但我们不希望此类型的非活动项目在搜索时向公众公开。
据我所知和理解,我想使用过滤器。但是当我提供一个要求active
为1的过滤器时,我现在只得到该类型的结果,而不是其他任何东西。因为现在它明确地查找具有该字段且等于1的项目。
如何执行条件"如果字段存在,请确保它等于1,否则忽略此条件"?这甚至可以实现吗?
答案 0 :(得分:10)
如果字段存在,请确保它等于1,否则忽略此条件
我认为它可以这样实现:
{
"query": {
"filtered": {
"filter": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"exists": {
"field": "active"
}
},
{
"term": {
"active": 1
}
}
]
}
},
{
"missing": {
"field": "active"
}
}
]
}
}
}
}
}
和完整的查询:
{
"query": {
"filtered": {
"query": {
"multi_match": {
"query": "whatever",
"type": "cross_fields",
"fields": [
"title",
"name"
]
}
},
"filter": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"exists": {
"field": "active"
}
},
{
"term": {
"active": 1
}
}
]
}
},
{
"missing": {
"field": "active"
}
}
]
}
}
}
}
}