0

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

谢谢您的帮助。

4

2 回答 2

1

在您的 schema.xml 中color保留多值字段。tag(请参阅Solr 中“multiValued”字段类型的用途是什么?)。我们将这些字段称为s_colors_tag。还将字段名称更改BuySellNames_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_BuySellName,例如:s_colors_tag

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

如果您catchallq=catchall:brown leather bag这样搜索,它将搜索名称、颜色和标签。

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

于 2013-06-07T04:26:04.427 回答
0

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

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

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

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

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

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

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

于 2013-06-07T03:37:04.107 回答