簡體   English   中英

Elasticsearch 按嵌套字段過濾

[英]Elasticsearch filter by nested fields

我在創建具有多種條件的 Elasticsearch 查詢時遇到問題。 我的模型看起來像:

data class Product(
        @Id
        val id: String? = null,
        val category: String,
        val imagesUrls: List<String>,
        @Field(type = FieldType.Double)
        val price: Double?,
        @Field(type = FieldType.Nested)
        val parameters: List<Parameter>?
)

data class Parameter(
        val key: String,
        val values: List<String>
)

我想通過以下方式查詢產品:

  • 類別(例如cars
  • 價格(在 20k $ 和 50k $ 之間)
  • 和參數 -> 例如有很多參數的產品,如關鍵capacity4L5L和第二參數齒輪傳動值manual

我當前的查詢如下所示:

GET data/_search
{

  "size": 10,
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "category.keyword": {
              "value": "cars"
            }
          }
        },
        {
          "nested": {
            "path": "parameters",
            "query": {
              "bool": {
                "must": [
                  {"term": {
                    "parameters.key.keyword": {
                      "value": "Capacity"
                    }
                  }},
                  {
                    "term": {
                      "parameters.key": {
                        "value": "4L, 5L"
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
  • 你能告訴我當參數鍵等於容量時如何過濾產品並檢查值列表是否包含其中一個值嗎?
  • 如何在一個查詢中組合許多此類操作?

示例數據:

{
   "category":"cars",
   "name":"Ferrari",
   "price":50000,
   "parameters":[
      {
         "key":"capacity",
         "values":"4L"
      },
      {
         "key":"gear transmission",
         "values":"automcatic"
      }
   ]
}

下面顯示的搜索查詢基於以下條件查詢數據:

  1. 類別(例如汽車)
  2. 和參數 -> 例如有很多參數的產品,如關鍵容量值 4L、5L 和第二參數齒輪傳動值手冊

添加包含索引數據、映射、搜索查詢和搜索結果的工作示例

索引映射:

{
  "mappings": {
    "properties": {
      "parameters": {
        "type": "nested"
      }
    }
  }
}

指數數據:

{
   "category":"cars",
   "name":"Ferrari",
   "price":50000,
   "parameters":[
      {
         "key":"gear transmission",
         "values":["4L","5L"]
      },
      {
         "key":"capacity",
         "values":"automcatic"
      }
   ]
}

{
   "category":"cars",
   "name":"Ferrari",
   "price":50000,
   "parameters":[
      {
         "key":"capacity",
         "values":["4L","5L"]
      },
      {
         "key":"gear transmission",
         "values":"automcatic"
      }
   ]
}

{
   "category":"cars",
   "name":"Ferrari",
   "price":50000,
   "parameters":[
      {
         "key":"capacity",
         "values":"4L"
      },
      {
         "key":"gear transmission",
         "values":"automcatic"
      }
   ]
}

搜索查詢:

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "category.keyword": {
              "value": "cars"
            }
          }
        },
        {
          "nested": {
            "path": "parameters",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "parameters.key": "capacity"
                    }
                  },
                  {
                    "terms": {
                      "parameters.values": [
                        "4l",
                        "5l"
                      ]
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "parameters",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "parameters.key": "gear transmission"
                    }
                  },
                  {
                    "match": {
                      "parameters.values": "automcatic"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

搜索結果:

"hits": [
         {
            "_index": "bstof",
            "_type": "_doc",
            "_id": "1",
            "_score": 3.9281754,
            "_source": {
               "category": "cars",
               "name": "Ferrari",
               "price": 50000,
               "parameters": [
                  {
                     "key": "capacity",
                     "values": "4L"
                  },
                  {
                     "key": "gear transmission",
                     "values": "automcatic"
                  }
               ]
            }
         },
         {
            "_index": "bstof",
            "_type": "_doc",
            "_id": "2",
            "_score": 3.9281754,
            "_source": {
               "category": "cars",
               "name": "Ferrari",
               "price": 50000,
               "parameters": [
                  {
                     "key": "capacity",
                     "values": [
                        "4L",
                        "5L"
                     ]
                  },
                  {
                     "key": "gear transmission",
                     "values": "automcatic"
                  }
               ]
            }
         }
      ]

當您需要匹配列表中的任何一個時,您可以使用terms查詢而不是term 更新查詢中的部分:

{
  "term": {
    "parameters.key": {
      "value": "4L, 5L"
    }
  }
}

到下面:

{
  "terms": {
    "parameters.values": {
      "value": [
        "4L",
        "5L"
      ]
    }
  }
}

請注意,如果 parameters.key 是分析字段並且存在相同的關鍵字子字段,則改用它。 例如parameters.values.keyword

您可以在此處閱讀有關術語查詢的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM