如果存在则过滤 elasticsearch 字段,否则忽略过滤器
Filter on elasticsearch field if exists, otherwise ignore the filter
我正在尝试过滤两个不同的索引,但在同一个弹性查询中,
我想过滤两个索引中不存在的字段:
第一指数:
label: string,
value: string,
isShowable: boolean
第二个指数:
label: string,
value: string
我想从第二个索引中检索所有项目,并且只从第一个索引中获取可显示的项目。
我在 php.
中使用 Elasticsearch DSL
这是我尝试过的:
Item::search($formattedRequest, function (Client $client, Search $body) {
$dispensationQuery = new TermQuery("isShowable", true);
$bool = new BoolQuery();
$bool->add($dispensationQuery, BoolQuery::SHOULD);
$body->addQuery($bool);
return $client->search(
['index' => firstIndex . "," . secondIndex, 'body' => $body->toArray()],
);
})->get();
但它会过滤我的所有项目,不会从第二个索引中检索值。
如何管理?
您可以使用 should 子句来组合 exists 和 bool 检查。如果任一字段存在或其值为真,它将类似于 return 文档
GET index1,index2/_search
{
"query": {
"bool": {
"should": [
{
"bool": {
"must_not": [
{
"exists": {
"field": "isShowable"
}
}
]
}
},
{
"term": {
"isShowable": {
"value": true
}
}
}
]
}
}
}
我正在尝试过滤两个不同的索引,但在同一个弹性查询中,
我想过滤两个索引中不存在的字段:
第一指数:
label: string,
value: string,
isShowable: boolean
第二个指数:
label: string,
value: string
我想从第二个索引中检索所有项目,并且只从第一个索引中获取可显示的项目。
我在 php.
中使用 Elasticsearch DSL这是我尝试过的:
Item::search($formattedRequest, function (Client $client, Search $body) {
$dispensationQuery = new TermQuery("isShowable", true);
$bool = new BoolQuery();
$bool->add($dispensationQuery, BoolQuery::SHOULD);
$body->addQuery($bool);
return $client->search(
['index' => firstIndex . "," . secondIndex, 'body' => $body->toArray()],
);
})->get();
但它会过滤我的所有项目,不会从第二个索引中检索值。
如何管理?
您可以使用 should 子句来组合 exists 和 bool 检查。如果任一字段存在或其值为真,它将类似于 return 文档
GET index1,index2/_search
{
"query": {
"bool": {
"should": [
{
"bool": {
"must_not": [
{
"exists": {
"field": "isShowable"
}
}
]
}
},
{
"term": {
"isShowable": {
"value": true
}
}
}
]
}
}
}