何时考虑 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 的相关文章

  • 只读有运行时开销吗?

    出于某种原因 我一直认为readonly字段有与其相关的开销 我认为这是 CLR 跟踪是否存在readonly字段是否已初始化 这里的开销是一些额外的内存使用量 用于跟踪状态以及分配值时的检查 也许我这么认为是因为我不知道readonly字
  • 查询中列的顺序重要吗?

    当从 MySQL 表中选择列时 与表中的顺序相比 选择列的顺序是否会影响性能 不考虑可能覆盖列的索引 例如 您有一个包含行 uid name bday 的表 并且有以下查询 SELECT uid name bday FROM table M
  • java mysql 准备好的语句

    我正在尝试使用 java 向数据库中进行简单的插入 它告诉我我的 sql 语法已关闭 但是 当我复制打印出来的字符串并将其放入 phpmyadmin 中的 sql 命令中时 它会正确执行该命令 并且我似乎无法弄清楚 java 中的字符串查询
  • 如何使用 MySQL 的 LOAD DATA LOCAL INFILE 在导入 CSV 时将字符串日期更改为 MySQL 日期格式

    我正在使用 MySQL 的 LOAD DATA LOCAL INFILE SQL 语句将数据从 CSV 文件加载到现有数据库表中 下面是一个 SQL 语句示例 LOAD DATA LOCAL INFILE file csv INTO TAB
  • 磁盘寻道时间测量方法

    我编写了一个脚本来测量 HDD 上的寻道时间 并且其完成方式的微小变化会导致显着不同的时间 第一个周期在磁盘开头的区域内进行跳转 第二个周期选择磁盘上执行查找的随机区域 相同大小 这种方法显然不同 但我不明白为什么它会改变结果 请注意 对于
  • 为什么这会返回资源 id #2? [复制]

    这个问题在这里已经有答案了 可能的重复 我如何从 PHP 中的 MySql 响应中 回显 资源 id 6 https stackoverflow com questions 4290108 how do i echo a resource
  • 在Python列表中交换元素的最快方法

    在Python中交换两个列表元素是否有比 L a L b L b L a 或者我必须求助于Cython http cython org or Weave http www scipy org Weave或类似的 看起来 Python 编译器
  • 如何在 sunspot solr 中进行简单的布尔查询

    gt gt gt marketing User search do s gt gt gt s fulltext Marketing gt gt gt end gt gt gt marketing total 1448 gt gt gt sa
  • 比特纳米。重置mysql根密码

    我如何重置 MySQL 中的 root 密码和帐户 因为我按照如何为其他服务器授予权限的说明操作 并且意外地将 root 用户 Mysql 绑定到其他 IP 地址 现在看来我无法在 localhost 上以管理员身份登录 Thanks 您有
  • 找到对应的未经V8优化的JS代码源

    我尝试优化 node js 应用程序的性能 因此我正在分析 V8 的 JIT 编译器的行为 当通过运行应用程序时node trace deopt trace opt code comments print optcode 输出包含许多重复出
  • Mysql 将 int 转换为 MAC

    我有一些数据可以转换 其中有 2 列 其中一列有 IP 它包含整数值 我在 mysql 查询中使用了以下函数 是否有一个函数可以用来转换我的 mac 列 其中包含整数和数据类型是bigint to MAC地址 SELECT INET NTO
  • 如何将ElasticSearch与MySQL集成?

    在我的一个项目中 我计划将 ElasticSearch 与 MySQL 结合使用 我已经成功安装ElasticSearch 我可以单独管理ES中的索引 但我不知道如何用 MySQL 实现同样的功能 我读过一些文件 但我有点困惑 没有明确的想
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • Draggable JS Bootstrap 模式 - 性能问题

    对于工作中的项目 我们在 JavaScript 中使用 Bootstrap Modal 窗口 我们想让一些窗口可移动 但我们遇到了 JQuery 的性能问题 myModal draggable handle modal header Exa
  • 一次从多个表中删除行

    我正在尝试将 2 个查询合并为一个这样的查询 result db gt query DELETE FROM menu WHERE name new or die db gt error result db gt query DELETE F
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • 映射 mysql 中同一个表的多个值

    您好 我必须使用另一个表中的值 id 获取文本值 表 1 包含值 ID 表 2 包含名称和值 ID 表 1 SEVERITY OCCURENCE DETECTABILITY 2 3 4 表 2 id name value 1 Very Hi
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希
  • solr 不标记受保护的单词

    我在 Solr Lucene 3 x 中有一个文档 其中有一个特殊的复制字段facet headline 以便有一个用于分面的未词干字段 有时两个或以上的单词属于在一起 这应该被处理 算作一个单词 例如 kim jong il 因此标题 星

随机推荐