Elasticsearch 查询按条件按特定字段值过滤文档
Elasticsearch query to filter document by specific field value with conditions
如果提供,我想过滤品牌名称,但如果过滤器为空,return所有品牌。
这是我的查询。
"query": {
"bool": {
"must": [
{
"terms": {
"seller": [
"Seller1",
"Seller2"
]
}
},
{
"bool": {
"should": [
{
"terms": {
"brand": [
"brand1"
]
}
},
{
"bool": {
"must_not": [
{
"term": {
"brand": {
"value": ""
}
}
}
]
}
}
]
}
},
{
"nested": {
"path": "Stock",
"query": {
"bool": {
"must": {
"match": {
"region": "Regional"
}
},
"filter": [
{
"term": {
"pincode": "12345"
}
}
]
}
}
}
}
]
}
}
我只想要 if (brand == ["brand1","brand2"]) return 那些品牌产品。但是如果提供空 return 全部。我尝试将它与 should 一起使用,如果提供了品牌,仍然可以获得所有东西。
有多种方式,下面提到了一些:
选项 1:
您可以在创建查询时在应用程序级别处理这种包含、排除的逻辑。如果您使用 Java 或 python 客户端,那么它很容易实现。如果你调用elasticsearch的直接搜索API那么你不能在调用api.
时添加brand term clause
选项 2:
您可以使用 Elasticsearch 的 search template 功能。
首先您需要创建搜索模板,如下例所示:
PUT _scripts/my-search-template
{
"script": {
"lang": "mustache",
"source": """{
"query": {
"bool": {
"must": [
{
"terms": {
"seller": [
"seller1",
"seller2"
]
}
}
],
"filter": [
{{#filter}}
{
"terms": {
"{{name}}":
{{#toJson}}value{{/toJson}}
}
}{{/filter}}
]
}
}
}"""
}
}
您可以使用下面的 API 来使用搜索模板进行搜索,这里如果您不在过滤器中传递 brand
它不会在实际查询中添加:
POST querycheck/_search/template
{
"id": "my-search-template",
"params": {
"filter": [
{
"name": "brand",
"value": [
"brand1",
"brand2"
]
}
]
}
}
您也可以使用 render api
检查查询模板生成的查询是否正确。
POST _render/template
{
"id": "my-search-template",
"params": {
"filter": [
{
"name": "brand",
"value": [
"brand1",
"brand2"
]
}
]
}
}
如果提供,我想过滤品牌名称,但如果过滤器为空,return所有品牌。 这是我的查询。
"query": {
"bool": {
"must": [
{
"terms": {
"seller": [
"Seller1",
"Seller2"
]
}
},
{
"bool": {
"should": [
{
"terms": {
"brand": [
"brand1"
]
}
},
{
"bool": {
"must_not": [
{
"term": {
"brand": {
"value": ""
}
}
}
]
}
}
]
}
},
{
"nested": {
"path": "Stock",
"query": {
"bool": {
"must": {
"match": {
"region": "Regional"
}
},
"filter": [
{
"term": {
"pincode": "12345"
}
}
]
}
}
}
}
]
}
}
我只想要 if (brand == ["brand1","brand2"]) return 那些品牌产品。但是如果提供空 return 全部。我尝试将它与 should 一起使用,如果提供了品牌,仍然可以获得所有东西。
有多种方式,下面提到了一些:
选项 1:
您可以在创建查询时在应用程序级别处理这种包含、排除的逻辑。如果您使用 Java 或 python 客户端,那么它很容易实现。如果你调用elasticsearch的直接搜索API那么你不能在调用api.
时添加brand term clause
选项 2:
您可以使用 Elasticsearch 的 search template 功能。
首先您需要创建搜索模板,如下例所示:
PUT _scripts/my-search-template
{
"script": {
"lang": "mustache",
"source": """{
"query": {
"bool": {
"must": [
{
"terms": {
"seller": [
"seller1",
"seller2"
]
}
}
],
"filter": [
{{#filter}}
{
"terms": {
"{{name}}":
{{#toJson}}value{{/toJson}}
}
}{{/filter}}
]
}
}
}"""
}
}
您可以使用下面的 API 来使用搜索模板进行搜索,这里如果您不在过滤器中传递 brand
它不会在实际查询中添加:
POST querycheck/_search/template
{
"id": "my-search-template",
"params": {
"filter": [
{
"name": "brand",
"value": [
"brand1",
"brand2"
]
}
]
}
}
您也可以使用 render api
检查查询模板生成的查询是否正确。
POST _render/template
{
"id": "my-search-template",
"params": {
"filter": [
{
"name": "brand",
"value": [
"brand1",
"brand2"
]
}
]
}
}