我正在尝试在我的laravel应用中实现搜索功能。由于数据安全问题,我的主管不喜欢Angolia。除此之外,一个好的选择是实现弹性搜索,另一个是使用mysql的全文搜索。我不确定有什么优点和缺点,虽然我在一些地方读过弹性搜索应该是更好的选择,但我想了解我正在使用的是什么,因为我之前没有用过搜索。< / p>
我正在研究MySQL的要求,似乎我只能使用InnoDb引擎实现5.6或更高版本。除此之外,我只能在char和text类型字段上实现全文索引。我不确定弹性搜索中允许哪种字段。
我知道我必须这样:
'signal(?!.*_RMS$)'
然后我猜我做了类似的事情:
DB::statement('ALTER TABLE posts ADD FULLTEXT search(title, body)');
是否有针对此的Eloquent实现,还是我必须使用数据库外观手动执行此操作?如果没有Eloquent实现,是否有第三方软件包具有此功能?
除此之外,我实际上还必须在相关表中搜索评论和标签等等。如何跨表创建索引或者不可能?如果不可能在MySQL中跨表创建索引,那么ES中是否有任何东西可以解决这个问题。
使用针对弹性搜索的MySQL全文搜索,我可能面临的其他优缺点是什么?
答案 0 :(得分:7)
使用MySQL,您将始终编制索引并搜索数据。
使用ElasticSearch,您可以更灵活地将索引编入一个单元。您可以获取项目的所有内容注释和标记,并将其作为一个项目放在ES中。
你也可能会发现ES会提供更好的性能和更好的结果,你会得到mysql。您还可以更灵活地使用同义词和加权等内容。
但它确实意味着您需要维护另一个堆栈,并且您必须管理内容的索引和更新。
因此,这取决于您的数据大小以及搜索作为功能的重要性。
我建议您从MySql文本搜索开始,因为在一个简单的情况下,它将很快设置,如果这不提供您需要的,那么升级到弹性搜索。您将至少拥有一个稻草人功能,可用于进一步优化您的搜索要求。
答案 1 :(得分:4)
ElasticSearch与MySQl-search的主要区别在于,当通过索引编制大量数据时,ES的工作速度更快。
索引包含现成的数据集,您可以使用这些数据操作更多的ES过滤器。因此,如果您使用ES进行搜索,则无法像在MySQL中那样直接请求数据库。
这是在HighLoad项目中使用ElasticSearch的主要原因。
对于少量数据,您不会感觉到差异。
答案 2 :(得分:-1)
使用ES,您可以使用一个API(_termvectors)获得TF-IDF。据我所知,MySQL没有这个功能,虽然它可以通过多次查询数据库来实现。