Sphinx搜索驱动的应用程序 - 错误的设计?

时间:2012-10-24 22:24:23

标签: django sphinx

我正在构建网络应用程序并使用django和Sphinx进行自由文本搜索。在向searchd提出请求之前,我需要应用其他限制,考虑2个表:

实体
ID
标题
说明
created_by_id
updated_by_id
CREATED_DATE
updated_date

EntityUser
ID
entity_id [FK到上表]
joining_user_id
is_approved
created_by_id
updated_by_id
CREATED_DATE
updated_date

我为主表Entity构建了RT索引,一切正常,但是我想仅对用户加入的那些实体进行查询,即特定user_id& entity_id在EntityUser中存在记录,is_approved = 1。问题是我无法索引EntityUser,因为没有字符串字段 - 此表仅保存整数/时间戳,如您所见。不确定我是否可以在包含子查询的SphinxQL中向另一个idex进行查询,即使我可以为该表构建索引。知道Sphinx用于相当大的项目取得了巨大的成功,我怀疑它是Sphinx的一个限制 - 是DB /应用程序的糟糕设计还是知识泄漏如何构建适当的RT索引?我可以以某种方式扩展现有索引,以便我可以使用上面的限制吗?

我想我可以在Sphinx返回MySQL端的记录ID之后应用其他限制,但这不会起作用:将返回权重最高的N条记录,但在应用其他限制后,结果可能为空。所以我需要获得一个搜索区域,然后只对用户可能看到的那些实体执行查询。

2 个答案:

答案 0 :(得分:0)

调整http://sphinxsearch.com/docs/current.html#attributes中的示例,您可以在conf中使用类似的内容:

...
sql_query = SELECT app_entity.id as id, 
                   app_entity.title as title, 
                   app_entity.description as description,
                   app_entityuser.id as userid
            FROM app_entity, app_entityuser
            WHERE app_entity.id = app_entityuser.entity_id AND app_entityuser.is_approved = 1

sql_attr_uint = id
sql_attr_uint = userid
...

我应该提供免责声明:我没试过。

我确实找到了相关的SO帖子,但看起来并没有完全解决它:Django-sphinx result filtering using attributes?

祝你好运!

答案 1 :(得分:0)

实际上我找到了答案,它与应用程序或数据库的设计无关。 事实上,这很简单 - 我只需要使用MVA作为RT索引,就像我对普通的那样(rt_attr_multi或rt_attr_multi_64)。在配置文件中,我将不得不这样做:

...
rt_attr_multi = entity_users
}


然后使用已加入实体并已获得批准的用户ID填充它。问题是我无法理解如何将MVA与RT索引一起使用,但不是很清楚。我认为RT指数和MVA没有足够的真实单词示例,所以我分享了这个例子来帮助解决类似的问题。

UPDATE:在最后一小时进行了战斗,以生成RT索引,并始终获得“未知列:'entity_users'”。终于找到了原因 - 如果你将MVA添加到RT索引(不知道普通的那个是否相同),你不仅要重启searchd守护进程(服务),还要删除你在“data”文件夹中的所有内容(或存储索引的地方)!