【问题标题】:Elastic search full text vs mysql full text?弹性搜索全文与mysql全文?
【发布时间】:2017-06-13 00:42:01
【问题描述】:

我正在尝试在我的 laravel 应用中实现搜索功能。由于数据安全问题,我的主管不喜欢安哥拉。除此之外,一个不错的选择是实现弹性搜索,另一个是使用 mysql 的全文搜索。我不确定优缺点是什么,虽然我在一些地方读到弹性搜索应该是更好的选择,但我想了解我正在使用什么,因为在此之前我没有使用过搜索。

我正在查看 MySQL 要求,看来我只能使用 InnoDb 引擎在 5.6 或更高版本中实现它。除此之外,我只能在 char 和 text 类型字段上实现全文索引。我不确定 Elastic 搜索中允许使用哪些类型的字段。

我知道我必须这样做:

DB::statement('ALTER TABLE posts ADD FULLTEXT search(title, body)');

然后我想我会做类似的事情:

SELECT * FROM posts
WHERE MATCH (title, body)
AGAINST ('foo' IN NATURAL LANGUAGE MODE);

是否有针对此的 Eloquent 实现,还是我必须使用 DB 外观手动执行此操作?如果没有 Eloquent 实现,是否有具有此功能的 3rd 方包?

除此之外,我实际上也必须在相关表中进行搜索,例如 cmets 和标签等。如何跨表创建索引或者不可能?如果无法在 MySQL 中跨表创建索引,ES 中有什么可以克服的吗?

使用 MySQL 全文搜索与弹性搜索相比,我可能面临哪些其他优缺点?

【问题讨论】:

  • @jeremy 是正确的。除非您有复杂的搜索功能,否则您可以从 mysql 开始以避免维护新堆栈。如果您可以分享一些搜索用例示例,我们可以提供更多帮助。

标签: mysql laravel search elasticsearch


【解决方案1】:

使用 MySQL,您将始终对数据进行索引和搜索。

使用 ElasticSearch,您可以更灵活地将索引作为一个单元。您可以将一个项目的所有内容 cmets 和标签作为一个项目放入 ES 中。

您还可能会发现 ES 通常会提供比 mysql 更好的性能和更好的结果。您还可以在同义词和加权等方面拥有更大的灵活性。

但这确实意味着您需要维护另一个堆栈,并且您必须管理内容的索引和更新。

因此,这将取决于您的数据大小和搜索作为一项功能的重要性。

我建议您从 MySql 文本搜索开始,因为在一个简单的情况下,它会很快设置,如果这不能提供您需要的内容,则升级到弹性搜索。您至少将拥有一个稻草人功能,可用于进一步细化您的搜索要求。

【讨论】:

  • 正确退出。我为了一个短命的项目退出了 es。
【解决方案2】:

ElasticSearch 与 MySQl-search 的主要区别在于,在通过索引处理大量数据时,ES 的工作速度更快。

索引包含现成的数据集,您可以使用这些数据集来操作进一步的 ES 过滤器。所以如果你用 ES 搜索,你不必像 MySQL 那样直接请求数据库。

这是在 HighLoad 项目中使用 ElasticSearch 的主要原因。

对于少量数据,您不会感觉到差异。

【讨论】:

  • 您能否告诉我将开始产生影响的数据量是多少?例如。 300,000 条文本记录会有多大差异?谢谢
【解决方案3】:

使用 ES,您可以通过一个 API (_termvectors) 获得 TF-IDF。据我所知,MySQL 不具备该功能,但可以通过多次查询数据库来实现。

编辑:此答案基于 2016-2017 年的 ES 功能。它不再有效。

【讨论】:

猜你喜欢
  • 2018-02-03
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 2015-07-03
相关资源
最近更新 更多