我们应该如何使用复合 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 比较神奇的功能之一:)
我们有一个 MySQL 数据库,它有三个 table:
Objects Composite Tags
+-----+-----+ +-----+-----+ +-----+-----+
| ID | Name| |ObjID|TagID| | ID | Name|
+-----+-----+ +-----+-----+ +-----+-----+
对象和标签 table 已编入索引,我们正在使用 Sphinx 搜索引擎(如果需要可以更改)。
当对象搜索为 运行 时,我们从搜索引擎获取对象 ID,然后通过 MySQL 查询检查复合 table 以查找对象的标签是什么.
问题是,当我们尝试在标签内搜索并获得多个标签结果时,我们需要首先获取与这些标签相关联的所有对象(目前,MySQL 正在做这部分)和然后回去找到他们的标签是什么(同样,MySQL 正在做这部分)。由于我们将拥有超过几百万个对象,如果有足够的请求运行,这将意味着我们的小服务器死亡,这部分确实需要一些优化。
我们正在寻找的是可以高效索引复合 table 的搜索引擎,或者搜索将这些 table 连接在一起的搜索引擎。你们中有人知道可以处理这些任务的搜索引擎吗(到目前为止我们还没有看到可以)或者我们应该完全采用不同的方法来解决这个问题吗?
像这样的标签可以很容易地在 Sphinx 中编入索引。实际上,您在构建索引时进行了非规范化。在 sql_query...
中使用 JOINsql_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 比较神奇的功能之一:)