如何在搜索中按标签过滤?

时间:2013-06-07 01:33:54

标签: sql solr tags

我不知道我在使用SOLR做了什么,所以到目前为止我已经能够通过做简单的事情来获得,并且我已经能够通过SQL中的连接来实现。

我有一个表buysellitems,其中包含很多字段,如

+-----------+-------+-------------------+
| buysellid | price | buysellname       |
+-----------+-------+-------------------+
|      3558 |   140 | Multi Layer       |
|      3561 |   175 | form              |
|      3562 |   160 | Floral            |
|      3563 |   199 | Specks            |
|      3564 |   385 | Ruby Red          |
|      3565 |   160 | B&W           |
|      3567 |   175 | Pattern           |
|      3569 |   125 | Fairy Floss Tunic |
|      3570 |   185 | Brandy Dress      |
|      3571 |    85 | Anissa            |
+-----------+-------+-------------------+

所以我有类似

的东西
<entity name="item" id="BuySellID" query="SELECT 
  i.BuySellID, i.BuySellName, i.Price, ...">
    <field name="buysellid" column="buysellid" />
    <field name="BuySellName" column="BuySellName" />
    <field name="price" column="price" />
    ...
</entity>

所以我很容易按名称搜索商品,我可以按价格过滤等。 但是用户也可以在buysellitemfeatures表中为其项目指定标签,如下所示:

+-----------+-------------+--------------+
| buysellid | featurename | featurevalue |
+-----------+-------------+--------------+
|      3860 | color       | red          |
|      3860 | color       | white        |
|      3861 | tag         | leather      |
|      3861 | tag         | natural      |
|      3861 | color       | black        |
|      3861 | color       | pink         |
|      3862 | tag         | clothing     |
|      3862 | color       | black        |
|      3862 | color       | pink         |
|      3863 | color       | black        |
|      3863 | color       | pink         |
|      3872 | color       | black        |
|      3872 | color       | white        |
|      3873 | color       | black        |
|      3873 | color       | white        |
|      3874 | color       | black        |
|      3874 | color       | white        |
+-----------+-------------+--------------+

如何过滤搜索结果(哪些项目)以在标签表中提供“皮革”的项目,即使在名称中找不到它?请注意,每个项目都有几列,我也想按颜色过滤。

我应该如何导入我的数据,以及如何查询以下内容:

  1. 搜索皮革并显示带有此标签或名称为
  2. 的商品
  3. 搜索相同的内容,但按黑色过滤(项目也可以有几种突出的颜色)
  4. 感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

在schema.xml中保留colortag的多值字段。 (见What is the use of "multiValued" field type in Solr?)。我们将这些字段称为s_colors_tag。同时将BuySellName的字段名称更改为s_BuySellName。 (我们将看到为什么我们暂时保留s_前缀。)

然后在data-config.xml中使用子实体来获取和索引这些字段的值:

<entity name="item" 
        id="BuySellID" 
        query="SELECT i.BuySellID, i.BuySellName AS s_BuySellName, i.Price, ...">
  <entity name="color" query="SELECT featurevalue AS s_color FROM buysellitemfeatures WHERE featurename='color' AND buysellid='${item.BuySellID}'"/>
  <entity name="tag" query="SELECT featurevalue AS s_tag FROM buysellitemfeatures WHERE featurename='tag' AND buysellid='${item.BuySellID}'"/>

现在,在schema.xml中,您可以保留一个包含s_BuySellNames_colors_tag内容的全文copyField,如:

<copyField source="s_*" dest="catchall"/>

如果您搜索catchall之类的q=catchall:brown leather bag,那么它会搜索名称,颜色和标签。

您考虑的另一个不错的选择是faceting。如果用户搜索bag,您可以显示colortag的构面以向下钻取。

答案 1 :(得分:0)

我最近才开始编写SQL操作。和你一样,我想知道如何按标签筛选出一大堆GUI选项,这样用户就只能看到对他来说实际上很重要的选项。

制作标签很简单,但不是一件容易的事。您必须提出一个符合您需求的标签组织。

过滤涉及将标签附加到三个实体:

  • 目标实体(比如用户)
  • 源实体(例如,数据库记录)
  • 过滤标准(附加到GUI控件的标准)

从概念上讲,通过在两组标签上执行SQL INTERSECTION或UNION(或任何设置操作最有效),可以轻松执行过滤。当目标和源具有与标准相同的所有标记时,应标识要显示的记录。

顺便说一下,您可以随时将标签附加到任何数据库的任何记录中。您可以创建标记的数据库表,然后通过数据库表和标记表之间的桥表使用多对多关系将任意数量的标记链接到所需的数据库行。

我认为我走在正确的轨道上。其他人肯定比我更具权威性,但这是我到目前为止所得到的。