我的数据库分为8个部分,其中每个部分都包含带有user_data表的数据库,为了更好的搜索性能我使用sphinx索引所有这些数据,但我遇到了一个问题......因为表user_data没有任何唯一字段为了代表每一行,但它是一个1到多个表,我无法正确运行我的sphinx索引,因为它需要唯一的id,这种方式可以解决重复的ID ...任何想法如何解决这个问题?或者从不同的段中的所有子索引生成唯一的id?
示例:
SELECT user_id, item_id, info
FROM user_data
返回类似的内容:
+----------+-----------------------+
| user_id | item_id | info |
+----------+-----------------------+
| 10 | 151 | asdf |
| 10 | 152 | test |
| 11 | 151 | 545 |
| 12 | 151 | sdfsd |
| 12 | 152 | eewwe |
| 12 | 153 | dfsd |
但我必须得到
+----------+-----------------------------+
| user_id | item_id | info | id |
+----------+-----------------------------+
| 10 | 151 | asdf | 1 |
| 10 | 152 | test | 2 |
| 11 | 151 | 545 | 3 |
| 12 | 151 | sdfsd | 4 |
| 12 | 152 | eewwe | 5 |
| 12 | 153 | dfsd | 6 |
当然,id必须是所有段的唯一
答案 0 :(得分:3)
首先,您应该在操作查询之前设置设置变量
sql_query_pre = SET @a := 1;
然后使用此变量来获取虚构的自动增量
sql_query = SELECT @a := @a + 1 AS id, user_id, item_id, info FROM user_data
答案 1 :(得分:1)
我对Sphinx并不熟悉,但是如果你想在表格中创建独特的ID,那么在你的情况下:
id
字段设置为AUTO_INCREMENT
并在特定范围的开头设置其起始编号答案 2 :(得分:0)
您可以在编制索引时执行以下操作:
SELECT user_id + 10 * 1 AS id, 1 AS segment_id, itme_id, info FROM user_data_1
...添加segment_id
。您将拥有其中的八个,因此索引查询看起来像:
SELECT (user_id + 10) * 1 AS id, 1 AS segment_id, itme_id, info FROM user_data_1
UNION
SELECT (user_id + 10) * 2 AS id, 2 AS segment_id, itme_id, info FROM user_data_2
UNION
SELECT (user_id + 10) * 3 AS id, 3 AS segment_id, itme_id, info FROM user_data_3
UNION
SELECT (user_id + 10) * 4 AS id, 4 AS segment_id, itme_id, info FROM user_data_4
UNION
SELECT (user_id + 10) * 5 AS id, 5 AS segment_id, itme_id, info FROM user_data_5
UNION
SELECT (user_id + 10) * 6 AS id, 6 AS segment_id, itme_id, info FROM user_data_6
UNION
SELECT (user_id + 10) * 7 AS id, 7 AS segment_id, itme_id, info FROM user_data_7
UNION
SELECT (user_id + 10) * 8 AS id, 8 AS segment_id, itme_id, info FROM user_data_8
然后,当您查询sphinx并获取ID时,只需将id
除以segment_id
并减去10
即可撤消算术。这样,所有的id都将在sphinx中独一无二。只需确保属性类型可以处理您要编制索引的ID的大小。
答案 3 :(得分:0)
正如在另一个回答中提到的那样使用UUID。但是狮身人面像不能使用UUID作为id。你需要一个INT。因此使用UUID_SHORT然后你有一个唯一的整数(对于mysql)。如果这不是开箱即用(例如,如果您使用Ubuntu-11.04),您将收到如下错误:
WARNING: DOCID_MAX document_id, skipping
您需要使用-enable-id64编译sphinx源代码,或者只需访问sphinx网站并获取最新的软件包(使用-enable-id64编译)。 this blog entry
中给出了这种索引方法的更完整示例答案 4 :(得分:-2)
我们正在使用crc32(uuid_short())来实现sphinx的32位实现。大部分时间都可以使用! OFC。一个人不能依赖于
的32位摘要