2011-11-30 185 views
1

后我以前的问题(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和属性ID的化合物键。

我希望狮身人面像通过value列进行搜索。但是,要在Sphinx中创建索引,我需要一个唯一的ID。我没有在这里。 同样在搜索时,我希望能够在propertyID列上进行过滤(例如,只能通过将propertyID定义为属性来实现propertyID 2的搜索值)。

在狮身人面像的论坛,我发现我可以创造一个多值属性,并将其设置为查询我的狮身人面像指数:现在不过

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

条款ArticleID将是独一无二的,我现在很想念值。所以我很确定这不是解决方案,对吧?

还有一些其他选项,如:

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

有没有其他的选择我可以使用,你会怎么做?

回答

1

在您的建议

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

这不能与大量的记录现有的表来完成,添加一个新的领域到大型表格需要一些时间,在此期间数据库不会响应。

  • 创建查询计算的独特价值(诸如articleID * 100000 +物业ID)

如果你这样做,你必须找到一种方式来获得从计算出的独特的条款ArticleID和属性ID ID。

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

  • new_sphinx_table具有以下字段

    ID - UNSIGNED INT/BIGINT

    条款ArticleID - UNSIGNED INT

    属性ID - UNSIGNED INT

然后你就可以写下面的索引查询

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

+0

Thans为你解答的结果。如果我创建了一个计算的独特值,那么让这两个ID回来是可取的。但是这当然不是一个很好的方法...... –

+0

如果你这样做,你需要一个字段2 *(INT)大小的字段来存储数据库中的组合键值,否则无论何时重新索引数据库,都必须重新计算它。想想你计划每天重新索引DB一次,DB表包含100000条记录,所以计算成本会更高。而用户的未来增长将会使其变得更加困难。 –

+0

是的。这不是一个好的选择。我会再等几天,看看其他人是否对我的问题有其他意见,然后再将其标记为答案。 –