![](/img/trans.png)
[英]How to query all documents, filter for a specific field and return the value for each document in Elasticsearch?
[英]Elasticsearch query to filter document by specific field value with conditions
如果提供,我想過濾品牌名稱,但如果過濾器為空,則返回所有品牌。 這是我的查詢。
"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"]) 只退回那些品牌產品。 但如果提供的是空的,則全部返回。 我嘗試將它與 should 一起使用,如果提供了品牌,仍然可以得到所有東西。
有多種方法,下面提到了一些方法:
選項1:
您可以在創建查詢時在應用程序級別處理這種包含、排除的邏輯。 如果您使用的是 Java 或 python 客戶端,則很容易實現。 如果您撥打elasticsearch直接搜索API,則撥打api時不能添加brand term clause
。
選項 2:
您可以使用 Elasticsearch 的搜索模板功能。
首先,您需要創建搜索模板,如下例所示:
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"
]
}
]
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.