何时考虑 Solr

2024-03-18

我正在开发一个应用程序,需要通过搜索来做有趣的事情,包括全文搜索、命中突出显示、分面搜索等......

该数据集可能有 3000-10000 条记录,每条记录有 20-30 个字段,并且全部存储在 MySQL 中。该网站的流量概况可能是中小型。

所有这些要求都可以在 MySQL 中(笨拙地)实现,但是在什么时候(就数据大小和流量水平而言)值得考虑更集中的技术,例如 Solr 或 Sphinx?


这个问题需要一个非常广泛的答案,需要从各个方面来回答。在特殊用例中,有一些特定的细节可能会使一个系统优于另一个系统,但我想在这里介绍一些基础知识。

我将完全以 Solr 作为几个功能大致相同的搜索引擎的示例。

我想从一些确凿的事实开始:

  • 您不能依赖 Solr/Lucene 作为安全数据库。有一系列事实,但它们主要包括缺少恢复选项、缺乏酸性事务、可能的复杂性等。如果您决定使用 solr,则需要从其他来源(如 SQL 表)填充索引。事实上,solr 非常适合存储包含来自多个表和关系的数据的文档,否则需要构建复杂的联接。

  • Solr/Lucene 提供令人兴奋的文本分析/词干提取/全文搜索评分/模糊功能。 MySQL 无法做到的事情。事实上,MySql 中的全文搜索仅限于 MyIsam,并且评分非常微不足道且有限。对字段进行加权、根据某些指标增强文档、根据短语邻近度对结果进行评分、匹配准确性等是非常艰巨的工作,几乎是不可能的。

  • 在 Solr/Lucene 中你有文档。你无法真正存储关系和过程。当然,您可以在某个文档的多值字段内对其他文档的键进行索引,这样您就可以实际存储 1:n 关系,并以两种方式获取 n:n,但会产生数据开销。不要误会我的意思,它对于很多用途来说都是完美且高效的(例如,对于某些产品目录,您想要存储产品的经销商,并且您只想搜索某些经销商或其他地方提供的零件)。但你会因为“有”/“没有”而到达可能性的尽头。您几乎不能做“获取至少 3 个经销商提供的所有产品”之类的事情。

  • Solr/Lucene 具有非常好的分面功能和搜索后分析。例如:在进行了 40000 次匹配的非常广泛的搜索之后,您可以显示,如果您将搜索细化为将此字段设置为该值,而将该字段设置为该值的组合,则您只会获得 3 次匹配。需要在 MySQL 中进行额外查询的事情可以高效且方便地完成。

那么我们总结一下

  • Lucene 的强大之处在于文本搜索/分析。由于反向索引结构,它的速度也快得令人难以置信。确实可以做很多后期处理,满足其他需求。尽管它是面向文档的并且没有像 SPARQL 中的三元组存储那样的“图形查询”,但可以存储和查询基本的 N:M 关系。如果您的应用程序专注于文本搜索,如果您没有充分的理由(例如非常复杂的多维范围过滤器查询),那么您绝对应该选择 Solr/Lucene。

  • 如果您没有文本搜索,而是可以点击某些内容但不能输入文本,那么旧的关系数据库可能是更好的选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何时考虑 Solr 的相关文章

  • CSV 损坏,如何修复?

    我正在尝试解析 CSV 我想将它放入数据库或只是用 JavaScript 解析它 但由于语法损坏 任何一种方法都会失败 我的整个 CSV 文件在这里 https gist github com 1023560 https gist gith
  • 使用一条语句在 MySQL 中添加多列

    我试图将多个列添加到 phpMyAdmin 中的现有表中 但我不断收到相同的错误 1064 你的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法 我在写信 ALTER TABLE WeatherCente
  • 使用 OpenMP 时无用的 printf 没有加速

    我刚刚编写了第一个 OpenMP 程序 它并行化了一个简单的 for 循环 我在双核机器上运行代码 发现从 1 个线程变为 2 个线程时速度有所提高 然而 我在学校 Linux 服务器上运行相同的代码并没有看到加速 在尝试了不同的事情之后
  • 浮点转换和性能

    我知道在浮点数和整数之间进行转换时可能会出现错误 但是性能如何 请忽略准确性问题 一般来说 如果我对不同算术类型的操作数 即不同的浮点类型 例如 float and double 和浮点 整数类型组合 例如float and int 是否存
  • 将solr 1.4索引升级到solr 3.3?

    我有一个使用 apache solr 1 4 构建的现有索引 我想在 3 3 版本中使用这个现有索引 正如您所知 索引格式在 3 x 之后发生了变化 那么如何才能做到这一点呢 我已经使用 Luke 将现有索引 即 1 4 版本 导出为 XM
  • PHP、MySQL、PDO 事务 - fetchAll() 可以在 commit() 之前吗?

    更多交易问题 我现在拥有的是一堆串在一起的查询 如果有任何失败 都会手动反转 代码块1 stmt1 db gt prepare Update table1 set col col 1 if stmt1 db gt execute stmt2
  • Docker容器CPU使用率监控

    根据 docker 的文档 我们可以通过以下方式获取 docker 容器的 CPU 使用率码头工人统计命令 CPU 列将给出容器正在使用的主机 CPU 的百分比 假设我限制容器使用 50 的主机单个 CPU 我可以通过 cpus 0 5 选
  • 如何通过csv文件仅更新sql表的一列

    我有一个 csv 文件包含一些数据 在我的 Sql 数据库中 我有一个具有多个列名的表 现在我只想通过 csv 文件更新一列 谢谢 你可以这样尝试 Import the csv file to a temp table Update you
  • PostgreSQL:存在与左连接

    我多次听说 postgres 处理exists查询速度更快左连接 http archives postgresql org pgsql performance 2002 12 msg00185 php http archives postg
  • SQL Server 与 MySQL:CONTAINS(*,'FORMSOF(THESAURUS,word)')

    我很震惊 当我在 SQL Server 中看到查询非常简单时 我花了 3 4 天弄清楚如何在 mysql 中实现词干提取 和同义词搜索 Select from tab where CONTAINS FORMSOF THESAURUS wor
  • 用索引更新表太慢

    我正在观察我们应用程序的实时系统上的探查器 我发现我们定期 每秒 运行一条更新指令 速度相当慢 每次大约需要400ms 查询包含此更新 这是缓慢的部分 UPDATE BufferTable SET LrbCount LrbCount 1 L
  • MySQL:错误 1215 (HY000):无法添加外键约束

    我读过了数据库系统概念 第六版 西尔伯沙茨 我将在 OS X 上的 MySQL 上实现第 2 章中所示的大学数据库系统 但我在创建表格时遇到了麻烦course 桌子department好像 mysql gt select from depa
  • 读取 CSV 文件单列的更快方法

    我正在尝试阅读一个列CSV文件至R尽快 我希望将标准方法将列放入 RAM 所需的时间减少 10 倍 我的动机是什么 我有两个文件 一个叫Main csv这是 300000 行和 500 列 其中一个称为Second csv即 300000
  • 数据库表可以没有主键吗?

    谁能告诉我关系数据库 例如MySQL SQL SERVER 中的表是否可以没有主键 例如 我可以有桌子day temperature 我注册的地方temperature and time 我不明白为什么要为这样的表设置主键 从技术上讲 您可
  • 使用 MySQL 5、简单成员资格提供程序、ASP.NET MVC4 和实体框架 5

    我在尝试着 使用 ASP NET MVC 4 对 MySQL 使用基于简单成员资格提供程序的身份验证默认 Web 应用程序配置为使用 MySQL 使用以下给出的教程 http www nsilverbullet net 2012 11 07
  • 返回空字符串:C++ 中的有效方法

    我有两种从函数返回空字符串的方法 1 std string get string return 2 std string get string return std string 哪一种更有效 为什么 Gcc 7 1 O3 这些都是相同的
  • MySQL如何获取可能重叠日期的开始/结束日期之和

    我有一个开始 结束日期表 我想按 id 对其进行分组并对每个 id 的总时间进行求和 例如 fk id start end 3 2014 03 21 10 02 2014 05 01 08 05 3 2014 06 05 05 00 201
  • MySQL 中复制一条记录

    我有一个表 我想复制表中的特定行 我知道这不是最好的方法 但我们正在寻找快速解决方案 这比我最初想象的要难 我需要做的就是将整个记录复制到 MySql 中自动增量表中的新记录 而不需要指定每个字段 这是因为该表将来可能会发生变化 并且可能会
  • PHP md5() 给出与 MySQL md5 不同的输出

    我正在尝试设置登录系统 但无法解决一个问题 PHP 通过 md5 给了我另一个输出 比MySQL 例如 在 PHP 中 password md5 brickmasterj return password 返回 3aa7b18f304e2e2
  • 将文件保存为 MYSQL 数据库中的 blob 或文件路径

    我知道这些问题是常见问题之一 但我需要您针对具体案例提供帮助 我正在开发一个应用程序 其中一些用户可以添加订单 一些用户可以执行这些订单 这些订单非常具体 因此只有有限数量的用户可以添加它们 然后 为每个订单生成三个文档 每个文档的大小不超

随机推荐