Symfony 3.4项目。如何添加搜索功能?

时间:2018-07-09 17:24:25

标签: symfony elasticsearch

我正在开发一个Symfony 3.4项目。它由几个捆绑组成:一个非常简单的博客(博客/帖子/评论实体),网页(页面/内容)和一些显示时间表(时间表/事件)的东西。现在,我想添加一个搜索按钮以及一种让用户从所有这些实体中查询基础数据的方法。

让我用一个非常简单的想法来说明自己。用户搜索“ goofy”,并说“ goofy”出现在一些帖子记录中(在“ message”和“ title”字段中),几个事件记录(“ description”字段中)和几个内容记录(...)。我需要返回指向不同视图的链接列表,例如blog / post / 1 / show,...,page / content / 27 / show,...,timeline / event / 19 / show,...

我想我可以通过简单的php + sql来做到这一点。问题是,是否有准备就绪的东西,例如我只需要配置它?

否则,我应该索引我的数据吗?

要索引数据,我看到Symfony暗示了Algolia,但这似乎为我的简单项目提供了沉重的解决方案。 (此外,我知道Algolia不是我可以运行服务器的东西,对吗?)

我也看到了FOSElasticaBundle(和Elastica),但是我不确定它是否仍在更新中。另外,它似乎有一些security issues

1 个答案:

答案 0 :(得分:2)

对于这样一个没有很多搜索维度并且没有任何特定要求的简单项目,我将只使用一个简单的Symfony表单并直接查询数据库

全面的搜索/索引服务将是彻底的矫over过正。 当然,除非您想将该项目作为学习这些技术的机会。


编辑:

一种简单的方法是对您要查询的所有表进行联接,对要检查的所有文本字段执行LIKE'%myfilter%',检索实体的ID,并将它们传递给树枝,然后在循环中获取将id参数传递给它的实体的视图控制器的路径。 如果您的模式很简单并且记录相对较少,那应该会很好地工作。 在这种情况下,我会坚持使用,避免使用全文本索引(..WHERE MATCH(content)AGAINST ...),因为mysql将此类索引与带有联接的复杂查询中的其他索引组合在一起非常慢。

稍微复杂一点的方法是使用侦听器或某种教义来在单独的单个表上维护每个实体的序列化全文表示,然后您可以直接查询该表,从而避免了可能的复杂联接及其开销。在这种情况下,您还可以更安全地查询全文索引。

这还可以为更轻松地切换到其他索引器/搜索引擎(当时间到来)开辟道路,因为您已经完成了一些工作以将搜索/索引与实际模型的结构脱钩。