2

因此,对于一个新项目,我正在为电子商务网站构建一个系统。我们的想法是从供应商那里进口产品,而不是将它们直接插入到我们的目录中,我们会将所有信息存储在一个暂存区。每个供应商都有自己的阶段(即数据库中的表),然后我会将多个暂存区域扁平化为单个实体(当前为单个表,但稍后可能会转换为 Sphinx 或 Solr)。然后,我们的经销商将能够搜索暂存产品的相关字段(名称和描述),并显示匹配的产品列表,然后选择将这些产品推送到实时目录中。搜索将查询单个表(展平的暂存区域)。

我的设计要求仅在单个展平表中存储可搜索和可过滤的字段 - 例如名称、描述、供应商 ID、供应商产品 ID 等。搜索查询将仅返回匹配项目的 ID 和用于的类 (supplier_id)确定产品来自哪个暂存区。

另一位高级工程师认为扁平化的搜索表应该包括其他元字段(不会被搜索),但可以在将产品从舞台“推送”到实时目录时使用。他还认为查询应该返回所有这些其他信息。

我对仅在展平表中具有可搜索字段并让搜索仅返回可用于获取有关产品的所有其他必要元数据的类/id 对的感觉非常强烈(简单的 select * from class_table where id in (1,2 ,3))。

我的部分理由是,这将使以后更容易将扁平表从数据库切换到像 sphinx 或 solr 这样的搜索服务器,并且不必仅仅因为搜索的实现发生更改而更改其余代码。

我在正确的道路上吗?我如何说服其他工程师为什么只保留可搜索字段并只返回 ID 很重要?或者更具体地说,为什么搜索应用程序应该只返回对象的 ID?

4

5 回答 5

2

我认为你在正确的道路上。如果这些其他字段没有提供任何值来唯一地标识暂存项目或允许用户过滤暂存项目,那么在将项目推送到实时环境之前,数据基本上是无用的。如果其他工程师认为额外的元数据将帮助用户做出更明智的决定,那么您不妨让这些额外的字段可搜索(从而满足您对表格的陈述目的。)

我能想到预取其他不可搜索数据的唯一原因是为了提高推送到实时环境的性能。

于 2009-09-29T21:41:32.700 回答
2

您应该使用每个工具来做它最擅长的事情。全文搜索引擎,例如 Solr 或 Sphinx,擅长搜索文本字段并快速对命中进行排名。它在以类似选择的方式检索存储的数据方面没有特别的优势。数据库为此进行了优化。所以,是的,你走在正确的道路上。有关决定在搜索引擎中存储什么内容所涉及的其他问题,请参阅搜索引擎与 DBMS 。

于 2009-10-01T06:18:53.227 回答
0

在 sphinx 的情况下,无论如何它只会返回文档 ID 和命名属性(属性大部分是数字数据)。我会说您的想法是正确的,因为JOIN如果您需要,其他元数据只是远离扁平表的简单方式。

于 2009-09-30T12:40:31.440 回答
0

您可以将 Solr 视为一个强大的索引,因此当索引返回 ID 时,solr 也会这样做是合乎逻辑的。

您可以使用 solr 查询参数fl来请求仅标识符的结果,例如fl=id.

但是,还有一个功能需要 solr 来给您返回一些数据:在匹配的文档中突出显示搜索词。如果您不需要它,那么仅使用 solr 来检索标识符就可以了(我假设您只需要文档列表,不需要其他功能,例如构面、相关文档或拼写检查)。

也就是说,您如何在搜索功能中构建对象应该很重要,无论是从数据库中使用唯一的 solr 检索 ID,还是从 solr 返回的字段(假设它们已存储),甚至两者兼而有之。想想 solr 获取“突出显示”的内容字段和其他内容的数据库。同样,如果您不需要突出显示,这不是问题。

于 2009-10-06T15:21:40.420 回答
0

我将 Solr 与数千个文档一起使用,但仅出于以下原因返回 ID:

对于 Solr : -如果附加了一些同步错误,这没什么大不了的(尤其是在您的情况下,显示不同的价格可能是一个大问题……就像该项目不在正确的位置,但数据是正确的) - 您将节省大量时间,因为当您不要求 Solr 返回文档的“描述”时(我的意思是多行文本)

对于您的数据库: -您可以缓存结果,因此使用 ID 会更快(您不需要每次都来自 Solr 的所有数据!!!)-您以相同的方式构建结果(您不需要当您想从 Solr 构建 html 时的特定方法,以及从您的数据库中构建的其他方法)

我觉得还有很多...

于 2009-10-13T10:47:52.873 回答