因此,对于一个新项目,我正在为电子商务网站构建一个系统。我们的想法是从供应商处导入产品,而不是直接将它们插入我们的目录中,我们会将所有信息存储在暂存区域中。每个供应商都有自己的阶段(即数据库中的表),然后我将多个临时区域展平为一个实体(当前是单个表,但稍后可能进入Sphinx或Solr)。然后,我们的商家将能够搜索登台产品的相关字段(名称和描述),并显示匹配的产品列表,然后选择将这些产品推入实时目录。搜索将查询单个表(展平的临时区域)。
我的设计要求只在单个展平的表格中存储可搜索和可过滤的字段 - 例如name,description,supplier_id,supplier_prod_id等。搜索查询将只返回匹配项目的ID和用于识别产品来自哪个临时区域的类(supplier_id)。
另一位高级工程师认为,展平的搜索表应该包含其他元字段(不会被搜索),但可以在将产品从阶段到实时目录“推送”时使用。他还认为查询应该返回所有其他信息。
我非常强烈地认为只有在平展表中有可搜索的字段并且搜索只返回类/ id对,可用于获取有关产品的所有其他必要元数据(从class_table中简单选择*其中id in( 1,2,3))。
我的部分理由是,这将使以后更容易将展平的表从数据库切换到像sphinx或solr这样的搜索服务器,而其余的代码不必仅仅因为搜索的实现而被更改改变。
我是在正确的道路上吗?我怎样才能说服其他工程师为什么只保留可搜索字段并仅返回ID?或者更具体地说,为什么搜索应用程序只返回对象的ID?
答案 0 :(得分:2)
我认为你走的是正确的道路。如果这些其他字段没有提供任何值来唯一标识分阶段项目或允许用户过滤分阶段项目,那么数据基本上无用直到项目被推送到实时环境。如果其他工程师认为额外的元数据将帮助用户做出更明智的决策,那么您也可以使这些额外的字段可搜索(从而满足您对表格的明确目的。)
我能想到预取其他不可搜索数据的唯一原因是为了提升现场环境的性能。
答案 1 :(得分:2)
您应该使用每个工具来获得最佳效果。全文搜索引擎,例如Solr或Sphinx,擅长搜索文本字段并快速对命中进行排名。它在以类似选择的方式检索存储数据方面没有特别的优势。为此优化了数据库。所以,是的,你走的是正确的道路。有关决定在搜索引擎中存储内容的其他相关问题,请参阅Search Engine versus DBMS。
答案 2 :(得分:0)
在sphinx的情况下,它只会将文档ID和命名属性返回给您(属性大多数是数值数据)。我会说你有正确的想法,因为如果你需要,其他元数据只是一个简单的JOIN
远离扁平表。
答案 3 :(得分:0)
您可以将Solr视为强大的索引,因此当索引返回ID时,solr也会这样做是合乎逻辑的。
您可以使用solr查询参数fl
来询问仅限标识符的结果,例如fl=id
。
然而,还有一个功能需要solr来回馈一些数据:匹配文档中搜索词的突出显示。如果你不需要它,那么使用solr来检索标识符就可以了(我假设你只需要文档列表,没有其他功能,比如facet,相关文档或拼写检查)。
也就是说,你应该如何在搜索功能中构建对象,无论是使用独特的solr来检索ID还是从solr返回的字段(提供它们存储)或者两者兼而有之。想想solr获取“突出显示”的内容字段和DB以获取其他内容字段。再次,如果您不需要突出显示,这不是问题。
答案 4 :(得分:0)
我正在使用Solr和数千个文档,但只返回id,原因如下:
对于Solr: - 如果附加一些同步错误,这不是什么大问题(特别是在你的情况下,显示不同的价格可能是一个大问题......就像项目不会在正确的位置,但数据是正确的) - 你会节省很多时间,因为当你不要求Solr返回文件的“描述”时(我的意思是多行文字)
对于您的数据库: - 你可以缓存你的结果,所以用ID更快(你不需要每次都来自Solr的所有数据!) - 以相同的方式构建结果(当您想要从Solr构建html时,不需要特定的方法,以及来自数据库的其他方法)
我认为还有很多......