5

我目前正在计划创建一个包含来自不同来源的各种数据的大型数据库(2+ 百万行)。我想避免围绕 auto_increment ids 构建数据库,以帮助防止复制的同步问题,并且因为插入的每个项目都将具有保证是唯一的字母数字产品代码 - 在我看来,使用它更有意义。

我正在寻找一个搜索引擎来索引这个数据库,Sphinx 看起来相当吸引人,因为它的设计围绕索引关系数据库。但是,查看各种教程和文档似乎表明数据库设计依赖于一种或另一种形式的 auto_increment 字段,并且文档中的一个相当大胆的声明说文档 ID 必须仅为 32/64 位整数,否则会中断。

有没有办法在没有 auto_increment 字段作为 id 的情况下让 Sphinx 索引数据库?

4

4 回答 4

17

当然 - 这很容易解决。如果您只需要为 Sphinx 创建自己的 ID,并且不希望它们发生冲突,您可以在 sphinx.conf 中执行类似的操作(MySQL 的示例代码)

source products {

  # Use a variable to store a throwaway ID value
  sql_query_pre = SELECT @id := 0 

  # Keep incrementing the throwaway ID.
  # "code" is present twice because Sphinx does not full-text index attributes
  sql_query = SELECT @id := @id + 1, code AS code_attr, code, description FROM products

  # Return the code so that your app will know which records were matched
  # this will only work in Sphinx 0.9.10 and higher!
  sql_attr_string = code_attr  
}

唯一的问题是您仍然需要一种方法来了解您的搜索匹配了哪些记录。Sphinx 将返回 id(现在没有意义)以及您标记为“属性”的任何列。

Sphinx 0.9.10 及更高版本将能够将您的产品代码作为搜索结果的一部分返回给您,因为它支持字符串属性。

0.9.10 尚未正式发布,但看起来很棒。看起来Zawodny 正在 Craig's List 上运行它,所以我不会对依赖此功能感到太紧张。

于 2009-10-30T14:37:56.377 回答
3

sphinx 只要求 id 是整数和唯一的,它不关心它们是否自动递增,因此您可以推出自己的逻辑。例如,为您的字符串键生成整数散列。

于 2009-10-29T16:15:06.340 回答
1

I think it's possible to generate a XML Stream from your data. Then create the ID via Software (Ruby, Java, PHP).

Take a look at http://github.com/burke/mongosphinx

于 2010-05-13T23:25:56.060 回答
1

Sphinx 不依赖于自动增量,只需要唯一的整数文档 ID。也许您可以在表中使用代理唯一整数 id 来使用 sphinx。众所周知,整数搜索比字母数字搜索要快得多。顺便说一句,您的字母数字产品代码有多长?有样品吗?

于 2009-10-29T16:38:17.107 回答