Solr 通过多值字段上的日期范围进行过滤
Solr filter via date range on multivalue field
我现在准备了一份列出汽车零件的文件。我目前已将所有设置设置为通过品牌、型号和类型进行过滤。但我想添加一个日期范围字段。
示例数据:
产品标题
制作
模型 1 - 日期范围
模型 2 - 日期范围
模型 3 - 日期范围
如您所见,可以有多个模型,每个模型都有一个特定的日期范围,零件适合车辆。我该怎么做呢?我什至想不出如何索引它更不用说过滤搜索了。
我了解到您有一个实体(产品、标题、品牌、{model1-dateRange1、model2-dateRange2、model3-dateRange3})。每个实体都有一个带有 2 个字段(模型、日期范围)的 child 实体。它的一对多关系
一种方法是 - 使用多值字段类型。所以每个文档都会有多个值。但在你的情况下,它不仅仅是字符串数组(模型或日期),而是 objects(模型和数据)的数组。所以你可以使用 model_date 组合并将它们存储为多个值。格式类似于 [prod1,title1,make1, {model1_date1,model2_date2,model3_date3}]。你的棘手部分有日期而不是字符串。因此,在基于日期(值的第二部分)进行搜索时,您需要了解这会产生怎样的影响。这种方法是一种非规范化(扁平)方法
另一种方法是使用 nested documents。这就是当前 object 关系的运作方式。更像是 Parent 和 child。 Parent 文档有(产品、标题、品牌)和 child 有(型号、日期)。该关系由 solr 维护。但是,您应该有一个字段可以区分文档是 child 还是 parent。这样做的好处是,您可以使用 child 属性搜索 parent,反之亦然。由你选择。
多亏了 Ramzy,所用的解决方案是使用将车辆型号和年份组合在一起的多值字段。因为我只需要过滤年份而不是完整日期,所以我将日期范围(PHP)拆分为多个值。示例:
MYSQL:
Brand:Ford Model:Model1 DateFrom:Jan-2011 DateTo:Feb-2013
Brand:Ford Model:Model2 DateFrom:Jan-2011 DateTo:Feb-2011
Solr:
Model1_2011,
Model1_2012,
Model1_2013,
Model2_2011,
然后在 model2 上通过年份过滤时我会搜索:Model2* 会找到所有相关的 products/facets,在 PHP 中我只会显示那些包含 Model2 的方面。在 2011 年搜索 Model2 的产品时,我会搜索 Model2_2011。可以添加更多属性,如 trim,然后搜索将更改为 Model2*2011,这可能 return: Model2_Trim1_2011.
我现在准备了一份列出汽车零件的文件。我目前已将所有设置设置为通过品牌、型号和类型进行过滤。但我想添加一个日期范围字段。
示例数据:
产品标题 制作 模型 1 - 日期范围 模型 2 - 日期范围 模型 3 - 日期范围
如您所见,可以有多个模型,每个模型都有一个特定的日期范围,零件适合车辆。我该怎么做呢?我什至想不出如何索引它更不用说过滤搜索了。
我了解到您有一个实体(产品、标题、品牌、{model1-dateRange1、model2-dateRange2、model3-dateRange3})。每个实体都有一个带有 2 个字段(模型、日期范围)的 child 实体。它的一对多关系
一种方法是 - 使用多值字段类型。所以每个文档都会有多个值。但在你的情况下,它不仅仅是字符串数组(模型或日期),而是 objects(模型和数据)的数组。所以你可以使用 model_date 组合并将它们存储为多个值。格式类似于 [prod1,title1,make1, {model1_date1,model2_date2,model3_date3}]。你的棘手部分有日期而不是字符串。因此,在基于日期(值的第二部分)进行搜索时,您需要了解这会产生怎样的影响。这种方法是一种非规范化(扁平)方法
另一种方法是使用 nested documents。这就是当前 object 关系的运作方式。更像是 Parent 和 child。 Parent 文档有(产品、标题、品牌)和 child 有(型号、日期)。该关系由 solr 维护。但是,您应该有一个字段可以区分文档是 child 还是 parent。这样做的好处是,您可以使用 child 属性搜索 parent,反之亦然。由你选择。
多亏了 Ramzy,所用的解决方案是使用将车辆型号和年份组合在一起的多值字段。因为我只需要过滤年份而不是完整日期,所以我将日期范围(PHP)拆分为多个值。示例:
MYSQL:
Brand:Ford Model:Model1 DateFrom:Jan-2011 DateTo:Feb-2013
Brand:Ford Model:Model2 DateFrom:Jan-2011 DateTo:Feb-2011
Solr:
Model1_2011,
Model1_2012,
Model1_2013,
Model2_2011,
然后在 model2 上通过年份过滤时我会搜索:Model2* 会找到所有相关的 products/facets,在 PHP 中我只会显示那些包含 Model2 的方面。在 2011 年搜索 Model2 的产品时,我会搜索 Model2_2011。可以添加更多属性,如 trim,然后搜索将更改为 Model2*2011,这可能 return: Model2_Trim1_2011.