我的数据库中有三张表
组织
| id |名字| attribute_1 | attribute_2 |
文档
| id | org_id |内容|
人
| id | org_id |名字|状态|
组织与文档之间的关系为1:1。组织可能只有一份文件。
组织与人之间的关系为1:n。组织可能有很多人。
表文档有大约12 000 000条记录,磁盘上的记录大于500 Gb。表中的记录永远不会改变。
表组织有大约30 000 000条记录,但磁盘上只有8 Gb。表中的记录经常变化,因此我需要进行完全重新索引。
以下是我的指数:
source organization {
sql_query = select * from organization
sql_attr_string attribute_1
sql_attr_string attribute_2
}
source document {
sql_query = select * from document
sql_attr_uint org_id
}
source person {
sql_query = select * from person
sql_attr_uint org_id
sql_attr_uint status
}
典型的请求如下:
找到包含" Acme"的前100个组织在名义上,"破产"在文档中,有名字的人" John"。
我该怎么做?
P.S。我使用Sphinx API,但我可以切换到SphinxQL
答案 0 :(得分:0)
Sphinx本身不能在索引之间进行JOIN。它唯一的多索引功能是进行UNION样式查询。
...所以要做到这一点需要建立一个“预先加入”的#39;指数。单个索引组合来自所有三个索引的数据。那么可以搜索任何组合。
sql_query
只是一个任意的数据库查询,并且大多数数据库引擎都支持连接,因此可以在那里进行JOIN。由于查询可能会很昂贵,因此可以使用Ranged Queries将其分解。
http://sphinxsearch.com/docs/current.html#ex-ranged-queries
Sphinx确实有GROUP BY,因此可以按组织或文档分组,如果只想要一行。 (因为索引可能包含多行,因为有多个人