【问题标题】:facets and doing some filtering based on facets方面并基于方面进行一些过滤
【发布时间】:2020-07-15 19:10:30
【问题描述】:

我有一个关于构面和基于构面进行过滤的问题。 我知道这是一个重复的问题,但我找不到答案。

我想知道如何在弹性搜索中实现相同的功能。

假设我有一个关于汽车和一些方面的索引——例如。模型和 颜色。

颜色

[ ] 红色 (10)

[ ] 蓝色 (5)

[ ] 绿色 (2)

型号

[ ] 宝马 (4)

[ ] 大众 (5)

[ ] 福特 (8)

如果我选择一个模型,我希望只获得该模型的颜色方面, 但我仍然想获得所有模型的方面。例如:

颜色

[ ] 红色 (2)

[ ] 蓝色 (2)

[ ] 绿色 (1)

型号

[ ] 宝马 (4)

[x] 大众 (5)

[ ] 福特 (8)

我已经搜索过,但没有找到有关此用例的示例。这是 可能,如果是,我如何过滤查询以获得这些结果?

亲切的问候

【问题讨论】:

    标签: python elasticsearch lucene elastic-stack facet


    【解决方案1】:

    我确信这已经在这里得到了多次回答,但让我们以你的具体例子为例。

    创建索引

    PUT lalit
    {
      "mappings": {
        "properties": {
          "model": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword"
              }
            }
          },
          "color": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword"
              }
            }
          }
        }
      }
    }
    

    摄取一些文档

    POST lalit/_doc
    {"color":"red","model":"bmw"}
    POST lalit/_doc
    {"color":"blue","model":"bmw"}
    POST lalit/_doc
    {"color":"red","model":"vw"}
    POST lalit/_doc
    {"color":"green","model":"vw"}
    POST lalit/_doc
    {"color":"blue","model":"ford"} 
    

    应用terms agg + filter terms agg 的组合

    GET lalit/_search
    {
      "size": 0,
      "aggs": {
        "all_models": {
          "terms": {
            "field": "model.keyword"
          }
        },
        "all_colors": {
          "terms": {
            "field": "color.keyword"
          }
        },
        "model_filtered_colors": {
          "filter": {
            "term": {
              "model.keyword": "vw"
            }
          },
          "aggs": {
            "actual_aggs": {
              "terms": {
                "field": "color.keyword"
              }
            }
          }
        }
      }
    }
    

    产量

    "aggregations" : {
        "model_filtered_colors" : {
          "doc_count" : 2,
          "actual_aggs" : {
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 0,
            "buckets" : [
              {
                "key" : "green",
                "doc_count" : 1
              },
              {
                "key" : "red",
                "doc_count" : 1
              }
            ]
          }
        },
        "all_models" : {
          "doc_count_error_upper_bound" : 0,
          "sum_other_doc_count" : 0,
          "buckets" : [
            {
              "key" : "bmw",
              "doc_count" : 2
            },
            {
              "key" : "vw",
              "doc_count" : 2
            },
            {
              "key" : "ford",
              "doc_count" : 1
            }
          ]
        },
        "all_colors" : {
          "doc_count_error_upper_bound" : 0,
          "sum_other_doc_count" : 0,
          "buckets" : [
            {
              "key" : "blue",
              "doc_count" : 2
            },
            {
              "key" : "red",
              "doc_count" : 2
            },
            {
              "key" : "green",
              "doc_count" : 1
            }
          ]
        }
      }
    

    model_filtered_colors 按颜色为您提供所有 vws,而其他 2 个聚合为您提供全面的总数(没有 vw 过滤器)。

    【讨论】:

    • 你的答案很好,但我想要一个功能类似于“亚马逊”方面的事情,如果我应用过滤器方面的桶。然后选择的存储桶不会改变,但都是其他的。再次,如果我从不同的存储桶应用另一个过滤器,那么选定的存储桶不会改变,但都是其他的。
    • 我读到了 post_filter 和全局聚合,但它们并没有像 amazon 或 ebay 那样更新事实
    • 您只需使用上面显示的 2 种聚合类型即可完成所有这些操作。多研究一下:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    相关资源
    最近更新 更多