繁体   English   中英

在多个字段上进行ElasticSearch过滤(具有聚集)

[英]ElasticSearch filtering on multiple fields (with aggregration)

我正在为网上商店构建多面过滤功能,如下所示:

Filter on Brand:
[ ] LG (10)
[ ] Apple (5)
[ ] HTC (3)

Filter on OS:
[ ] Android 4 (11)
[ ] Android 5 (2)
[ ] IOS (5)

我在Elasticsearch中使用聚合和过滤,经过几天学习ES(喜欢它!),这对我来说效果很好。 但是可悲的是,我现在停留在实际过滤上。

如果我单击“ LG”,则将禁用IOS筛选器,并且(5)将更改为(0),并且右侧的结果将更改为13个Android手机。 很好,到目前为止很好。

现在,如果我单击“ Android 4”,则右侧只会显示11个电话。 真棒! 到现在为止还挺好 :)

但是现在,如果我单击“ Android 5”,所有结果都会消失。 我不确定自己在做什么错。 我希望所有配备Android 4和5的LG手机都能出现。

下面是最后一种情况的示例查询。 请注意,查询中还包含其他一些字段,这些字段用于构建分面过滤。

{
   "size":100,
   "query":{
      "filtered":{
         "query":{
            "match_all":[

            ]
         },
         "filter":{
            "bool":{
               "must":[
                  {
                     "term":{
                        "brand.untouched":"LG"
                     }
                  },
                  {
                     "term":{
                        "operating_system.untouched":"Android 4"
                     }
                  },
                  {
                     "term":{
                        "operating_system.untouched":"Android 5"
                     }
                  }
               ],
               "should":[

               ],
               "must_not":{
                  "missing":{
                     "field":"model"
                  }
               }
            }
         },
         "strategy":"query_first"
      }
   },
   "aggs":{
      "brand.untouched":{
         "terms":{
            "field":"brand.untouched"
         }
      },
      "operating_system.untouched":{
         "terms":{
            "field":"operating_system.untouched"
         }
      },
      "camera1":{
         "histogram":{
            "field":"camera1",
            "interval":5,
            "min_doc_count":0
         }
      },
      "price_seperate":{
         "histogram":{
            "field":"price_seperate",
            "interval":125,
            "min_doc_count":0
         }
      }
   }
}

有人知道解决方案吗? 非常感谢。

您的查询正在搜索的文档中, operating_system.untouched既是“ Android 4”又是“ Android 5”,但事实并非如此,因此结果为零。 您可以简单地使用Terms Filter以便operating_system.untouched的值与“ Android 4”或“ Android 5”匹配的文档。 以下是您应该使用的更新查询:

{
   "size":100,
   "query":{
      "filtered":{
         "filter":{
            "bool":{
               "must":[
                  {
                     "terms":{
                        "brand.untouched": [
                            "LG"
                        ]
                     }
                  },
                  {
                     "terms":{
                        "operating_system.untouched": [
                            "Android 4",
                            "Android 5"
                        ]
                     }
                  }
               ],
               "must_not":{
                  "missing":{
                     "field":"model"
                  }
               }
            }
         },
         "strategy":"query_first"
      }
   },
   "aggs":{
      "brand.untouched":{
         "terms":{
            "field":"brand.untouched"
         }
      },
      "operating_system.untouched":{
         "terms":{
            "field":"operating_system.untouched"
         }
      },
      "camera1":{
         "histogram":{
            "field":"camera1",
            "interval":5,
            "min_doc_count":0
         }
      },
      "price_seperate":{
         "histogram":{
            "field":"price_seperate",
            "interval":125,
            "min_doc_count":0
         }
      }
   }
}

如果要添加价格范围之类的另一组类别,只需在bool must子句中添加bool should子句。 当您想按两个范围(0, 100](100, 200]的现场price进行过滤时,请参见下面的示例。这基本上意味着您可以嵌套mustshould过滤器以实现所需的任何布尔逻辑在Elasticsearch中实现过滤。

... 
"must":[
    {
        "terms":{
            "brand.untouched": [
                "LG"
            ]
        }
    },
    {
        "terms":{
            "operating_system.untouched": [
               "Android 4",
               "Android 5"
            ]
        }
    },
    "bool": {
        "should": [
            {
                "range": {
                    "price": {
                        "gt": 0,
                        "lte": 100
                    }
                }
            },
            {
                "range": {
                    "price": {
                        "gt": 100,
                        "lte": 200
                    }
                }
            }
        ]
    }
],
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM