我们应该如何使用复合 table 实现对 MySQL 的搜索?

How should we implement search on MySQL with composite table?

我们有一个 MySQL 数据库,它有三个 table:

  Objects                Composite                  Tags   
+-----+-----+          +-----+-----+            +-----+-----+
| ID  | Name|          |ObjID|TagID|            | ID  | Name|
+-----+-----+          +-----+-----+            +-----+-----+

对象和标签 table 已编入索引,我们正在使用 Sphinx 搜索引擎(如果需要可以更改)。

当对象搜索为 运行 时,我们从搜索引擎获取对象 ID,然后通过 MySQL 查询检查复合 table 以查找对象的标签是什么.

问题是,当我们尝试在标签内搜索并获得多个标签结果时,我们需要首先获取与这些标签相关联的所有对象(目前,MySQL 正在做这部分)和然后回去找到他们的标签是什么(同样,MySQL 正在做这部分)。由于我们将拥有超过几百万个对象,如果有足够的请求运行,这将意味着我们的小服务器死亡,这部分确实需要一些优化。

我们正在寻找的是可以高效索引复合 table 的搜索引擎,或者搜索将这些 table 连接在一起的搜索引擎。你们中有人知道可以处理这些任务的搜索引擎吗(到目前为止我们还没有看到可以)或者我们应该完全采用不同的方法来解决这个问题吗?

像这样的标签可以很容易地在 Sphinx 中编入​​索引。实际上,您在构建索引时进行了非规范化。在 sql_query...

中使用 JOIN
sql_query = SELECT Objects.ID, Objects.Name AS name, 
        GROUP_CONCAT(Tags.Name) AS tags
        FROM Objects
        LEFT JOIN Composite ON (Objects.ID = ObjID) 
        LEFT JOIN Tags ON (Tags.ID = TagID)
        GROUP BY Objects.ID ORDER BY NULL

...这为您提供了一个名为标签的字段,您可以使用该字段搜索标签。 (即关键字搜索)

你应该也想运行'GROUP BY'查询来获取分面信息。所以将 TagID 添加为 Multi-Value-Attribute,这样就可以查询,and/or 按标签分组。

, GROUP_CONCAT(TagID) as tag_ids 添加到 sql_query。 然后添加sql_attr_multi = uint tag_ids from field;

把它变成MVA。 http://sphinxsearch.com/docs/current.html#mva(狮身人面像与 lower-case fields/attributes 名称配合使用效果更好)

然后您可以运行 sphinxQL 查询

SELECT GROUPBY() AS tag_id, COUNT(*) AS count FROM index 
   WHERE MATCH('keyword search') GROUP BY tag_id ORDER BY count DESC;

这会为您提供与关键字搜索匹配的对象的所有标签(及其计数)。 (整理所有标签的所有繁重工作都在 sphinx 内部完成)

如果这么说,按 MVA 分组是 Sphinx 比较神奇的功能之一:)