【问题标题】:Sphinx Search, compound key狮身人面像搜索,复合键
【发布时间】:2011-11-30 20:42:54
【问题描述】:

在我上一个问题 (http://*.com/questions/8217522/best-way-to-search-for-partial-words-in-large-mysql-dataset) 之后,我选择了 Sphinx 作为我的 MySQL 数据库上方的搜索引擎。

我用它做了一些小测试,它看起来很棒。但是,我现在正处于需要一些帮助/意见的地步。

我有一个表格文章(结构并不重要)、一个表格属性(结构也不重要)和一个表格,其中包含每篇文章的每个属性的值(这就是它的全部内容)。 存储这些值的表具有以下结构:

articleID   UNSIGNED INT
propertyID  UNSIGNED INT
value       VARCHAR(255)

主键是articleID和propertyID的复合键。

我希望 Sphinx 搜索 value 列。但是,要在 Sphinx 中创建索引,我需要一个唯一的 id。我这里没有。 此外,在搜索时,我希望能够过滤 propertyID 列(例如,仅搜索 propertyID 2 的值,我可以通过将其定义为属性来做到这一点)。

在 Sphinx 论坛上,我发现我可以创建一个多值属性,并将其设置为我的 Sphinx 索引的查询:

SELECT articleID, value, GROUP_CONCAT(propertyID) FROM t1 GROUP BY articleID

articleID 现在将是唯一的,但是,现在我缺少值。所以我很确定这不是解决方案,对吧?

还有一些其他选项,例如:

  • 向表中添加一个额外的列,这是唯一的
  • 在查询中创建计算的唯一值(如articleID*100000+propertyID

还有其他我可以使用的选项吗?你会怎么做?

【问题讨论】:

    标签: mysql search-engine sphinx


    【解决方案1】:

    在您的建议中

    • 向表中添加一个额外的列,这是唯一的

    这不能用于具有大量记录的现有表,因为将新字段添加到大表需要一些时间,并且在此期间数据库将无法响应。

    • 在查询中创建计算的唯一值(如 articleID*100000+propertyID)

    如果你这样做,你必须想办法从计算出的唯一 ID 中获取 articleID 和 propertyID。

    另一种替代方法是,您可以创建一个新表,其中包含一个用于 sphinx 的关键字段和另外两个用于保存 articleID 和 propertyID 的字段。

    • new_sphinx_table 包含以下字段

      id - UNSIGNED INT/BIGINT

      articleID - UNSIGNED INT

      propertyID - 无符号整数

    然后你可以编写如下的索引查询

    SELECT id, t1.articleID, t1.propertyID, value FROM t1 INNER JOIN new_sphinx_table nt ON t1.articleID  = nt.articleID AND t1.propertyID = nt.propertyID;
    

    这是一个示例,因此您可以对其进行修改以满足您的要求。

    什么 sphinx 返回匹配 new_sphinx_table.id 值与其他属性列。您可以通过使用 new_sphinx_table.id 值并加入您的 t1 命名表和 new_sphinx_table

    来获得结果

    【讨论】:

    • 谢谢你的回答。如果我创建一个计算出的 unqiue 值,则可以返回两个 ID。但这当然不是一个很好的方式......
    • 如果你这样做,你需要一个 2*(INT) 大小的字段来在数据库中存储组合键值,否则每当你重新索引数据库时,你必须重新计算它。认为您计划每天重新索引一次数据库,并且数据库表包含 100000 条记录,因此计算成本会更高。而用户的未来增长将使其变得更加困难。
    • 是的。这不是一个好的选择。我会再等几天,看看其他人是否对我的问题有其他看法,然后再将其标记为答案。
    • 你是对的。因为没有最好的解决方案,所以会有更好的解决方案。在短时间内发布一个帖子作为答案,它会阻止其他人发布不同的想法。