【问题标题】:How can I filter by tags in my search?如何在搜索中按标签过滤?
【发布时间】:2013-06-03 05:16:01
【问题描述】:

我不知道我在用 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. 搜索相同的东西,但按黑色过滤(项目也可以有几种突出的颜色)

感谢您的帮助。

【问题讨论】:

  • 您的问题似乎与 SQL 的关系比与 Solr 的关系更大。我怀疑这个问题需要重新标记。
  • 我已经有必要的 SQL 来查询标签/颜色。

标签: sql solr tags


【解决方案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 中,您可以保留一个包罗万象的文本 copyField,其中存储了 s_BuySellNames_colors_tag 的内容,例如:

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

如果您像q=catchall:brown leather bag 一样搜索catchall,那么它将搜索名称、颜色和标签。

您可以考虑的另一个不错的选择是faceting。如果用户搜索bag,那么您可以显示colortag 的构面以深入了解。

【讨论】:

  • 我不想搜索颜色,我想按它们过滤。我想按标签搜索。我目前也将项目的名称提升到其他字段(如描述)之上,所以如果可能的话,我不想将它们全部合并到一个字段中。我也许可以将项目名称与标签合并,但是我失去了将它们提升不同数量的能力。
【解决方案2】:

我也是最近才开始编写 SQL 操作。和你一样,我想知道如何通过标签过滤掉大量 GUI 选项,以便只向用户展示对他来说实际上很重要的选项。

制作标签很容易,但并非易事。你必须想出一个对你的需求有意义的标签组织。

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

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

从概念上讲,通过对两组标签执行 SQL INTERSECTION 或 UNION(或任何最有意义的集合操作)来轻松执行过滤。当目标和源具有与标准相同的所有标签时,应该标识要显示的记录。

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

我认为我在正确的轨道上。其他人在这方面肯定比我更有权威,但这是我迄今为止自己提出的。

【讨论】:

    猜你喜欢
    • 2017-05-25
    • 1970-01-01
    • 2019-06-16
    • 2014-11-15
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多