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

如何从查询结果中构建可筛选选项列表?

单修德
2023-03-14

我有一个产品集合,每个产品都会有:

  1. 价格
  2. 属性(例如:大小:xl,s,xxl;颜色:黄,红,蓝;....)
  3. 制造商
  4. 类别(一个产品可以有多个类别)

此集合在ElasticSearch中索引。现在,当我查询类别A中所有产品的列表时,我还希望获得:

  1. 所有产品的价格范围(最小-最大)
  2. 所有可能选项和值的列表(大小、颜色和相应的值xl、s、xxl、Yellog、red、blue)
  3. 制造商(耐克、阿迪达斯、...)
  4. 类别

然后,我将使用这些信息构建一个过滤器,用户可以使用它来缩小结果列表(类似于许多其他电子商务网站上的过滤器,如亚马逊、Overstock、Ebay...)

我研究了facet搜索,但不确定这是否是我想要的,我希望找到一种方法来检索所有的信息,我需要与最小数量的查询可能。

共有1个答案

夏侯博
2023-03-14

当谈到亚马逊类别搜索的风格时,Facets绝对是要走的路。为了在尽可能少的查询中检索所有方面,您可以非常容易地做到这一点,只需包含更多。我使用Sense chrome扩展,因为它非常漂亮,很容易用于搜索示例。在这个例子中,我放置了一些产品文档,包括名称、价格、制造商、类别和颜色。正如您所看到的,我们已经在一个匹配的所有方面搜索了所有这些方面。您可以执行您喜欢的查询,甚至可以执行全局方面或任意数量的方面(范围、直方图等)。这实际上完全取决于您想要什么样的文档,以及数据是如何形成的。一个非常令人兴奋的部分,这是下一个大的东西聚合!您可以使用聚合进行出色的搜索。假设您有一个时间戳和一个位置,您可以在特定位置的一个时间之间的一种颜色上进行聚合。qbox.io将在未来几天发布一篇博文,介绍您可以使用aggs做的一些有趣的事情。

DELETE /test_index

PUT /test_index

PUT /test_index/product/1
{
   "name":"prod1",
   "price":19.95,
   "manufacturer":"manu1",
   "category":["cat1","cat2"],
   "color":"red"
}

PUT /test_index/product/2
{
   "name":"prod2",
   "price":25,
   "manufacturer":"manu2",
   "category":["cat2","cat3"],
   "color":"yellow"
}

PUT /test_index/product/3
{
   "name":"prod3",
   "price":4.99,
   "manufacturer":"manu2",
   "category":["cat1","cat2","cat3"],
   "color":"yellow"
}

PUT /test_index/product/4
{
   "name":"prod4",
   "price":19.95,
   "manufacturer":"manu3",
   "category":["cat1","cat3"],
   "color":"blue"
}

POST /test_index/_search
{
   "query": {
       "match_all": {}
   },
   "facets" : {
       "price_stats" : {
           "statistical" : {
               "field" : "price"
           }
       },
       "color_terms" : {
           "terms": {
              "field": "color",
              "size": 10
           }
       },
       "manufacturer_terms" : {
           "terms": {
              "field": "manufacturer",
              "size": 10
           }
       },
       "category_terms" : {
           "terms": {
              "field": "category",
              "size": 10
           }
       }
   }
}`
 类似资料:
  • 作为这个答案的后续(关于方法1),我想更进一步: 我想根据某些标准筛选子对象。我尝试了下面的查询,但它仍然没有筛选出孙实体下的对象。 关联类实体 类关系ParentEntity<1-OneTomany-x>ChildEntity<1-OneTomany-x>GrandChildEntity

  • 问题内容: 我需要您的帮助,这是我的SQL查询: 这是我的结果: 现在我必须计算第一个查询的结果! 问题答案: 您可以将查询换成另一个: 参见带有演示的SQL Fiddle 为了使其工作,需要一个列别名,并且您必须为子查询本身提供一个别名。

  • 我正在尝试查找一个查询唯一的名称列表,并排除两个查询结果之间的共同名称。例如,我想要学生A、B和C所选课程的名称,并从该列表中排除学生D和E所选的课程。在这个问题的答案的帮助下(Neo4j Cypher:从结果中排除某些节点),我尝试了这个密码代码,它是有效的,但我得到的结果是节点。我希望它是一个名称列表,而不是节点。 非常感谢。

  • 试图从结构中获取项目列表,避免大量的for循环和if,所以我想使用 例如,lets具有以下结构: 我要创建: null List TestitemsFiltered=House1.FamilyList.Stream().FlatMap(f->f.PersonList.Stream().FlatMap(p->p.ItemList.Stream().Filter(Item->Item.Name.Equ

  • 我看不到任何关于何时应该使用查询或过滤器或两者结合的描述。他们之间有什么区别?谁能解释一下吗?

  • 我正在尝试输出一个显示求职者对特定工作的申请的视图。到目前为止,我只能查看所有接收到的应用程序的转储,但我无法实现查询来仅查看特定作业的应用程序。即我希望能够查看每个不同空缺职务的条目。谢谢 \\ \\