在上一个问题(http://stackoverflow.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的复合键。
我要斯芬克斯在value栏中搜索。但是,要在Sphinx中创建索引,我需要一个唯一的id。这里没有。
另外,在搜索时,我希望能够过滤propertyID列(例如,仅搜索propertyID 2的值,可以将其定义为属性)。
在Sphinx论坛上,我发现可以创建一个多值属性,并将其设置为对Sphinx索引的查询:
SELECT articleID, value, GROUP_CONCAT(propertyID) FROM t1 GROUP BY articleID

articleID现在是唯一的,但是,现在我缺少值。所以我很确定这不是解决办法,对吧?
还有其他一些选择,比如:
向表中添加一个额外的列,该列是唯一的
在查询中创建计算出的唯一值(如articleID*100000+propertyID
我还有其他选择吗?你会怎么做?

最佳答案

在你的建议中
向表中添加一个额外的列,该列是唯一的
对于一个具有大量记录的现有表,不能对一个大表添加一个新字段需要一些时间,并且在此期间数据库将不响应。
在查询中创建计算出的唯一值(如articleID*100000+propertyID)
如果这样做,则必须找到从计算出的唯一id中获取articleID和propertyID的方法。
另一种替代方法是,您可以创建一个新表,其中有一个sphinx的键字段和另两个保存articleID和propertyID的字段。
具有以下字段的新_sphinx_表
id-无符号INT/BIGINT
articleID-无符号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返回的是与其他属性列匹配的新sphinx_table.id值。通过使用new_sphinx_table.id值并将t1命名表和new_sphinx_table连接起来,可以获得结果

关于mysql - sphinx 搜索,复合键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8332672/

10-12 20:54