簡體   English   中英

用於獲取過濾器選項的彈性搜索詞聚合

[英]Elastic search terms aggregation for getting filter options

我正在嘗試實施產品搜索並希望獲得搜索結果以及要從中過濾的過濾器。 我已設法獲得過濾鍵參考,但還想要這些鍵的值

我的產品主體是

 {
      ...product,
       "attributes": [
            {
              "name": "Color",
              "value": "Aqua Blue"
            },
            {
              "name": "Gender",
              "value": "Female"
            },
            {
              "name": "Occasion",
              "value": "Active Wear"
            },
            {
              "name": "Size",
              "value": "0"
            }
          ],
 }

我在 es 中使用這個查詢

GET product/_search
{
  "aggs": {
    "filters": {
      "terms": {
        "field": "attributes.name"
      
      },
      "aggs": {
        "values": {
          "terms": {
            "field": "attributes.value",
            "size": 10
          }
        }
      }
    }
    
  }
}

不知道為什么,但我得到了每個鍵的所有值

 "aggregations": {
    "filters": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "Color",
          "doc_count": 3,
          "values": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
              {
                "key": "Active Wear",
                "doc_count": 3
              },
              {
                "key": "Aqua Blue",
                "doc_count": 3
              },
              {
                "key": "Female",
                "doc_count": 3
              },
              {
                "key": "0",
                "doc_count": 2
              },
              {
                "key": "10XL",
                "doc_count": 1
              }
            ]
          }
        },
        {
          "key": "Gender",
          "doc_count": 3,
          "values": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
              {
                "key": "Active Wear",
                "doc_count": 3
              },
              {
                "key": "Aqua Blue",
                "doc_count": 3
              },
              {
                "key": "Female",
                "doc_count": 3
              },
              {
                "key": "0",
                "doc_count": 2
              },
              {
                "key": "10XL",
                "doc_count": 1
              }
            ]
          }
        },
        {
          "key": "Occasion",
          "doc_count": 3,
          "values": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
              {
                "key": "Active Wear",
                "doc_count": 3
              },
              {
                "key": "Aqua Blue",
                "doc_count": 3
              },
              {
                "key": "Female",
                "doc_count": 3
              },
              {
                "key": "0",
                "doc_count": 2
              },
              {
                "key": "10XL",
                "doc_count": 1
              }
            ]
          }
        },
        {
          "key": "Size",
          "doc_count": 3,
          "values": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
              {
                "key": "Active Wear",
                "doc_count": 3
              },
              {
                "key": "Aqua Blue",
                "doc_count": 3
              },
              {
                "key": "Female",
                "doc_count": 3
              },
              {
                "key": "0",
                "doc_count": 2
              },
              {
                "key": "10XL",
                "doc_count": 1
              }
            ]
          }
        }
      ]
    }

此外,我不想手動指定所有鍵,如Color 、Size以分別獲取它們各自的值。 謝謝:)

為了簡單起見,您必須使用單個字段來存儲屬性:

"gender":"Male"

我假設你有大量的屬性,所以你創建一個數組來處理你將不得不使用“嵌套”字段類型。

嵌套類型保留每個嵌套文檔屬性之間的關系。 如果您不使用嵌套,您將看到所有屬性和值混合在一起,並且您將無法在不手動添加過濾器的情況下按屬性進行聚合。

你可以在這里閱讀我寫的一篇文章:

https://opster.com/guides/elasticsearch/data-architecture/elasticsearch-nested-field-object-field/

映射:

PUT test_product_nested
{
  "mappings": {
    "properties": {
      "attributes": {
        "type": "nested",
        "properties": {
          "name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "value": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      },
      "title": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      }
    }
  }
}

此查詢將僅顯示 XL 碼的紅色產品並按屬性聚合。

如果您想使用 OR 而不是 AND,則必須使用“should”子句而不是“filter”子句。

詢問

POST test_product_nested/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "nested": {
            "path": "attributes",
            "query": {
              "bool": {
                "filter": [
                  {
                    "term": {
                      "attributes.name.keyword": "Color"
                    }
                  },
                  {
                    "term": {
                      "attributes.value.keyword": "Red"
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "attributes",
            "query": {
              "bool": {
                "filter": [
                  {
                    "term": {
                      "attributes.name.keyword": "Size"
                    }
                  },
                  {
                    "term": {
                      "attributes.value.keyword": "XL"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "attributes": {
      "nested": {
        "path": "attributes"
      },
      "aggs": {
        "name": {
          "terms": {
            "field": "attributes.name.keyword"
          },
          "aggs": {
            "values": {
              "terms": {
                "field": "attributes.value.keyword",
                "size": 10
              }
            }
          }
        }
      }
    }
  }
}

結果

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0,
    "hits": [
      {
        "_index": "test_product_nested",
        "_id": "aJRayoQBtNG1OrZoEOQi",
        "_score": 0,
        "_source": {
          "title": "Product 1",
          "attributes": [
            {
              "name": "Color",
              "value": "Red"
            },
            {
              "name": "Gender",
              "value": "Female"
            },
            {
              "name": "Occasion",
              "value": "Active Wear"
            },
            {
              "name": "Size",
              "value": "XL"
            }
          ]
        }
      }
    ]
  },
  "aggregations": {
    "attributes": {
      "doc_count": 4,
      "name": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [
          {
            "key": "Color",
            "doc_count": 1,
            "values": {
              "doc_count_error_upper_bound": 0,
              "sum_other_doc_count": 0,
              "buckets": [
                {
                  "key": "Red",
                  "doc_count": 1
                }
              ]
            }
          },
          {
            "key": "Gender",
            "doc_count": 1,
            "values": {
              "doc_count_error_upper_bound": 0,
              "sum_other_doc_count": 0,
              "buckets": [
                {
                  "key": "Female",
                  "doc_count": 1
                }
              ]
            }
          },
          {
            "key": "Occasion",
            "doc_count": 1,
            "values": {
              "doc_count_error_upper_bound": 0,
              "sum_other_doc_count": 0,
              "buckets": [
                {
                  "key": "Active Wear",
                  "doc_count": 1
                }
              ]
            }
          },
          {
            "key": "Size",
            "doc_count": 1,
            "values": {
              "doc_count_error_upper_bound": 0,
              "sum_other_doc_count": 0,
              "buckets": [
                {
                  "key": "XL",
                  "doc_count": 1
                }
              ]
            }
          }
        ]
      }
    }
  }
}

暫無
暫無

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

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