1

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

实体
ID
标题
描述
created_by_id
updated_by_id
created_date
updated_date

EntityUser
id
entity_id [FK to the table]
join_user_id
is_approved
created_by_id
updated_by_id
created_date
updated_date

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

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

4

2 回答 2

0

实际上我已经找到了答案,它与应用程序或数据库的设计无关。事实上,这很简单——我只需要将 MVA 用于 RT 索引,就像我对普通索引(rt_attr_multi 或 rt_attr_multi_64)所做的那样。在配置文件中,我必须执行以下操作: 然后使用已加入实体并已获得批准的用户 ID 填充它。问题是我无法理解如何将 MVA 与 RT 索引一起使用,但不清楚。我认为 RT 索引和 MVA 的实际例子不够多,所以我分享了这个来帮助解决类似的问题。 更新:

...
rt_attr_multi = entity_users
}




上一小时正在努力生成 RT 索引,并且总是得到“未知列:'entity_users'”。终于找到了原因——如果你将 MVA 添加到 RT 索引(不知道这是否与普通索引相同),你不仅要重新启动 searchd 守护进程(服务),还要删除“数据”文件夹中的所有内容(或您存储索引的位置)!

于 2012-11-01T09:55:57.267 回答
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?

祝你好运!

于 2012-10-25T01:58:26.173 回答