我目前正计划使用来自不同来源的各种数据创建一个大型数据库(200多万行)。我想避免围绕auto_increment id构建数据库,以帮助防止复制的同步问题,并且因为插入的每个项目都有一个保证是唯一的字母数字产品代码 - 在我看来更有意义使用它。
我正在寻找一个搜索引擎,用Sphinx索引这个数据库看起来很有吸引力,因为它围绕索引关系数据库进行设计。但是,查看各种教程和文档似乎表明数据库设计依赖于某种形式的auto_increment字段,而文档中的bold statement则表示文档ID必须仅为32/64位整数或事物中断。
有没有办法让Sphinx将数据库编入索引而没有auto_increment字段作为id?
答案 0 :(得分: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 is running it over at Craig's List所以我不会太依赖这个功能。
答案 1 :(得分:3)
sphinx只要求id为整数且唯一,它不关心它们是否自动递增,因此你可以推出自己的逻辑。例如,为字符串键生成整数哈希值。
答案 2 :(得分:1)
Sphinx不依赖于自动增量,只需要唯一的整数文档ID。也许你可以在表中使用代理唯一的整数id来使用sphinx。众所周知,整数搜索比字母数字搜索更快。 BTW你的字母数字产品代码有多长?任何样品?
答案 3 :(得分:1)
我认为可以从您的数据生成XML Stream。 然后通过软件(Ruby,Java,PHP)创建ID。