如何在Elasticsearch中使用聚合实现层次结构分面搜索

时间:2016-02-24 16:31:36

标签: php mysql elasticsearch

我正在开发一个标准的电子商务应用程序,该应用程序包含多个类别的产品。

类别是树,并以数据库中的嵌套集形式存储。

类别可以包含子类别等。

我想使用Elasticsearch进行搜索功能,但我找不到任何用例(或样本)用于此类标准(几乎所有网上商店都有该功能)的分面搜索,我将在下面尝试解释:

分类

表:

----------------------------------------------
|id      | name        | lft     | rgt       |
----------------------------------------------
|1       | Electronics | 1       | 18        |
|2       | Accesories  | 2       | 9         |
|3       | Cards       | 3       | 4         |
|4       | Stations    | 5       | 6         |
|5       | Cables      | 7       | 8         |
|6       | Computers   | 10      | 15        |
|7       | Laptops     | 11      | 12        |
|8       | Software    | 13      | 14        |
|9       | Phones      | 16      | 17        |
|10      | House       | 19      | 20        |

visualy:

Electronics
    Accesories
        Cards
        Stations
        Cables
    Computers
        Laptops
        Software
    Phones
House

产品

---------------------------
|id      | name           |
---------------------------
|1       | Lenovo G580    |
|2       | Iphone 5       |
|3       | Keyboard       |
|4       | Mouse          |
|5       | Sony Xperia Z5 |

产品和类别

---------------------------
|product_id  | category_id |
----------------------------
| 1          | 1           |
| 1          | 6           |
| 1          | 7           |
| 2          | 1           |
| 2          | 9           |
| 3          | 1           |
| 3          | 2           |
| 4          | 1           |
| 4          | 2           |
| 5          | 1           |
| 5          | 9           |

我想做什么

案例1

假设在这种情况下没有选择类别,搜索框输入为空。 我希望显示属于所有根类别的不同产品,并在所有类别中对其进行计数。有些想法:

-----------------------------------------------------------------
| ------------------------------------                          |
| | type for searching...            |                          |
| ------------------------------------                          |
-----------------------------------------------------------------
| Categories       | Products                                   |
-----------------------------------------------------------------
| Electronics (5)  | |-------------------------------------------
|                  | |  Lenovo G580                             |
|                  | |-------------------------------------------
|                  | |-------------------------------------------
|                  | |  Iphone 5                                |
|                  | |-------------------------------------------
|                  | |-------------------------------------------
|                  | |  Keyboard                                |
|                  | |-------------------------------------------
|                  | |-------------------------------------------
|                  | |  Mouse                                   |
|                  | |-------------------------------------------
|                  | |-------------------------------------------
|                  | |  Sony Xperia Z5                          |
|                  | |-------------------------------------------

请注意,左侧没有House类别,因为它没有产品。

案例2

假设在这种情况下选择了一个类别,搜索框输入再次为空。

对我来说有一个关键点:

如果用户选择类别(在这种情况下为电子设备),我想显示其子类别的一个级别,其中包含属于他们的产品数量以及父类别的链接。有些想法:

-----------------------------------------------------------------
| ------------------------------------                          |
| | type for searching...            |                          |
| ------------------------------------                          |
-----------------------------------------------------------------
| Categories       | Products                                   |
-----------------------------------------------------------------
| ^--              | |-------------------------------------------
| Accesories (2)   | |  Lenovo G580                             |
| Computers (1)    | |-------------------------------------------
| Phones (2)       | |-------------------------------------------
|                  | |  Iphone 5                                |
|                  | |-------------------------------------------
|                  | |-------------------------------------------
|                  | |  Keyboard                                |
|                  | |-------------------------------------------
|                  | |-------------------------------------------
|                  | |  Mouse                                   |
|                  | |-------------------------------------------
|                  | |-------------------------------------------
|                  | |  Sony Xperia Z5                          |
|                  | |-------------------------------------------

案例3

如果用户选择最后一个类别级别(如下面的电话),我想只显示该级别,仅显示该产品

-----------------------------------------------------------------
| ------------------------------------                          |
| | type for searching...            |                          |
| ------------------------------------                          |
-----------------------------------------------------------------
| Categories       | Products                                   |
-----------------------------------------------------------------
| ^--              | |-------------------------------------------
| Phones (2)       | |  Iphone 5                                |
|                  | |-------------------------------------------
|                  | |-------------------------------------------
|                  | |  Sony Xperia Z5                          |
|                  | |-------------------------------------------

案例4

如果用户在搜索框中键入了一些想法(但没有选择任何类别),我想显示所有匹配搜索条件的产品以及与该产品匹配的所有独特类别(无论在哪个级别)。

很抱歉这个很长的问题,但我希望它能解释我的意思。

问题

如何使用Elasticsearch实现这种标准方式?

研究

SearchKit http://demo.searchkit.co/http://docs.searchkit.co/stable/docs/components/navigation/hierarchical-menu.html的方式工作,但我无法弄清楚如何实现映射和查询以实现此类情况......

0 个答案:

没有答案