当前位置: 首页 > 知识库问答 >
问题:

多滤波器搜索

羊舌旭尧
2023-03-14

我有个问题。在常见的购物车网站有功能搜索产品与多个过滤器。例如,我正在搜索运动装备与一些过滤器,如:

>

  • 制造商

    • [x]耐克
    • 阿迪达斯
    • 茵宝

    选项

    • 尺寸
      • [x]s
      • [x]M
      • L
      • [x]白色
      • 黄色
      • 红色
      • [x]蓝色

      这是我的地图

      PUT test/product/_mapping
      {
          "product":{
              "properties" : {
                  "name" : {"type" : "string", "store":"yes"},
                  "manufacturer" {"type": "string}
                  "options" : {
                      "type": "nested"
                  }
              }
          }
      }
      

      部分测试数据

      POST test/product/1
      {
          "name": "Shirt 1",
          "manufacturer": "Adidas",
          "options":[
                  {
                      "Color" : ["Red", "Green"]
                  },
                  {
                      "Size" : ["S","M","L"]
                  }
              ],
          "price":250000
      }
      
      POST test/product/2
      {
          "name": "Shirt 2",
          "manufacturer": "Nike",
          "options":[
                  {
                      "Color" : ["Blue", "Green", "White"]
                  },
                  {
                      "Size" : ["S", "L", "XL"]
                  }
              ],
          "price":100000
      }
      
      POST test/product/3
      {
          "name": "Shirt 3",
          "manufacturer": "Umbro",
          "options": [
                  {
                      "Color" : ["Red"]
                  },
                  {
                      "Size" : ["S","XXL"]
                  }
              ],
          "price": 300000
      }
      

      有了这个查询,一切都很好

      POST test/product/_search
      {
          "query": {
              "filtered": {
                 "query": {
                      "match_all": {}
                 },
                 "filter": {
                     "bool": {
                          "must": [
                             {
                                 "nested": {
                                    "path": "options",
                                    "filter": {
                                        "bool": {
                                            "must": [ 
                                               {
                                                  "terms": {
                                                     "options.Color": [
                                                        "white"
                                                     ]
                                                  }
                                               }
                                            ]
                                        }
                                    }
                                 }
                             },
                             {
                                 "term": {
                                    "manufacturer": "nike"
                                 }
                             }
                          ]
                     }
                 }
              }
          }
      }
      

      但是,如果我在选项过滤器中添加更多的条件,我没有得到结果

      POST test/product/_search
      {
          "query": {
              "filtered": {
                 "query": {
                      "match_all": {}
                 },
                 "filter": {
                     "bool": {
                          "must": [
                             {
                                 "nested": {
                                    "path": "options",
                                    "filter": {
                                        "bool": {
                                            "must": [ 
                                               {
                                                  "terms": {
                                                     "options.Color": [
                                                        "white"
                                                     ]
                                                  }
                                               },
      
                                               {
                                                  "terms": {
                                                     "options.Size": [
                                                        "s"
                                                     ]
                                                  }
                                               }
                                            ]
                                        }
                                    }
                                 }
                             },
                             {
                                 "term": {
                                    "manufacturer": "nike"
                                 }
                             }
                          ]
                     }
                 }
              }
          }
      }
      

      我不知道我在映射或查询中是否错了,或者您能告诉我在这种情况下创建映射的最佳方法是什么。谢谢你所有的帮助。

  • 共有1个答案

    谷梁德容
    2023-03-14

    这里的问题是嵌套类型的用法。您的嵌套筛选器不是对所有子级进行计算,而是对每个子级进行单独计算。由于没有一个嵌套对象能够满足筛选(同时具有colorsize),因此不会得到任何结果。您有两种选择:

    >

  • 将这些单独的嵌套对象合并在一起

    POST test/product/1
    {
        "name": "Shirt 1",
        "manufacturer": "Adidas",
        "options":[
            {
                "Color" : ["Red", "Green"],
                "Size" : ["S","M","L"]
            }
        ],
        "price":250000
    }
    

    您的映射和查询保持不变。

    不要使用嵌套类型,而是使用简单的对象类型。您必须更改选项的映射:

    PUT test/product/_mapping
    {
        "product":{
            "properties" : {
                "options" : {
                    "type": "object"
                }
            }
        }
    }
    
    POST test/product/_search
    {
       "query": {
          "filtered": {
             "query": {
                "match_all": {}
             },
             "filter": {
                "bool": {
                   "must": [
                      {
                         "terms": {
                            "options.Color": [
                               "white"
                            ]
                         }
                      },
                      {
                         "terms": {
                            "options.Size": [
                               "s"
                            ]
                         }
                      },
                      {
                         "term": {
                            "manufacturer": "nike"
                         }
                      }
                   ]
                }
             }
          }
       }
    }
    
    "options":[
        {
            "Color" : "Blue",
            "Size": "S"
        },
        {
            "Color": "Red",
            "Size" : "L"
        }
    ]
    

    如果你想筛选蓝色和S的项,那么你就必须使用嵌套筛选器。

  •  类似资料:
    • 我对Elasticsearch相当陌生,所以这是我的问题。我想用elasticsearch做一个搜索查询,想用多个术语过滤。 如果我想搜索用户'Tom',那么我希望获得用户'is active=1'、'is private=0'和'is owner=1'的所有匹配项。 这是我的搜索查询 谢谢你的帮助!!

    • 我有一个关于书籍的数据集,每本书都可以是一种或多种语言的。每个用户都注册为拥有一种或多种语言。 当用户搜索书籍时,我只想返回那些他们理解所有语言的书籍。 例如,系统中有以下两本书: 如果John被注册为懂英语、德语、法语和意大利语,那么他的查询结果永远不应该包括Book B。 我的系统目前是使用Apache Solr编写的,最后我编写了一个插件来执行子集操作(如果记录的语言是用户语言的子集,则该记

    • 因此,我成功地在所有列出的日志中获得了警报日志(由于根已经在INFO中,所以大量的工作都是徒劳的)。但我真正想要的是,现在只在我的新appender上获得来自某个特定类的信息。 我不确定我已经很好地描述了这一点,而且我不了解log4j,所以如果需要,请要求澄清。这个难题与限制我的新appender警告和更大有关,除了我还想要一个特定类的Info。这个类的这些信息也应该发送到父记录器通常记录信息的每

    • 我对验证FIR滤波器感兴趣。我已经实现了一个移动平均FIR滤波器,并编写了几个刺激来验证。 第一个刺激是一个正弦波,我希望滤波器按原样通过。档案员有。第二个刺激,我只传递一个冲动,并期望协效出现在输出上。这是我实际看到的。 然而,我觉得有两个问题需要注意。首先,不能依赖于波形形状来判断滤波器是否工作。我必须有可量化的值,并使用它作为一个基础,以得出结论,如果过滤器是工作的。例如。信噪比... 以下

    • 作为参考,我使用的是Elasticsearch 6.4.0 我有一个Elasticsearch查询,它返回一定的命中视频数,我正在尝试删除文本字段值过于相似的命中。我的查询是: 此查询使用自定义函数分数和筛选器来返回用户可能喜欢的书籍(他们尚未创作的书籍)。对于某些人来说,它返回的名字非常相似的书(即乔治·华盛顿的一生,乔治·华盛顿的美好时光,谁是乔治·华盛顿),我希望热门歌曲有一套更多样化的名字

    • 我想明白的是。 如何给出多个筛选器表达式,例如,我想从服务器获取.csv和.xml文件。 如何忽略单个文件类型,例如,我想只忽略具有.txt类型的文件,并获取rest文件。