如何为 B2B Web 应用程序设置 Lucene/Solr?

2024-01-07

Given:

  • 每个客户(商业客户)1 个数据库
  • 5000 名客户
  • 客户端拥有 2 到 2000 个用户(平均约为 100 个用户/客户端)
  • 每个数据库有 10 万到 1000 万条记录
  • 用户需要经常搜索这些记录(这是导航数据的最佳方式)

可能相关的信息:

  • 每周几个新客户(工作时间内的任何时间)
  • 多个Web服务器和数据库服务器(用户可以通过任何Web服务器登录)
  • 让我们保持对语言或 sql 品牌的不可知性,因为 Lucene(和 Solr)拥有广泛的支持

例如:

乔尔·斯波尔斯基在《播客 #11 https://blog.stackoverflow.com/2008/06/podcast-11/他的托管 Web 应用程序产品 FogBugz On-Demand 使用 Lucene。他拥有数千名按需客户。每个客户都有自己的数据库。

他们使用一个每个客户端的索引并将其存储在客户端的数据库中 http://fogbugz.stackexchange.com/questions/1866/where-is-the-fogbugz-search-index-stored/1878#1878。我不确定细节。我不确定这是否是 Lucene 的一个严肃的 mod。

问题:

您将如何设置 Lucene 搜索,以便每个客户端只能在其数据库内进行搜索?

您将如何设置索引?
您将索引存储在哪里?
您需要为所有搜索查询添加过滤器吗?
如果客户取消,您将如何删除他们的(部分)索引? (这可能是微不足道的——还不确定)

可能的解决方案:

为每个客户端(数据库)建立一个索引

  • 优点:搜索速度更快(比单一索引方法)。索引与客户端数据的大小相关。
  • 缺点:我不确定这意味着什么,也不知道这是否超出了 Lucene 的范围。

有一个带有database_name字段的巨大索引。始终包含database_name作为过滤器。

  • 专业人士:不确定。也许有利于技术支持或计费部门搜索所有数据库以获取信息。
  • 缺点:搜索速度较慢(比按客户端索引方法)。如果删除查询过滤器,则安全性存在缺陷。

最后一件事:
我也会接受使用的答案Solr http://lucene.apache.org/solr/(Lucene 的扩展)。也许它更适合这个问题。没有把握。


你从 FogBugz StackExchange 召唤了我。我叫 Jude,是 FogBugz 的现任搜索架构师。

以下是 FogBugz On Demand 搜索架构的设置方式的粗略概述[1]:

  • 出于与数据可移植性、安全性等相关的原因,我们将所有按需数据库和索引分开。
  • 虽然我们确实使用 Lucene(实际上是 Lucene.NET),但我们对其后端进行了相当大的修改,以便它可以将其索引完全存储在数据库中。此外,每个网络主机上都会维护一个本地缓存,以便尽可能避免不必要的数据库访问。
  • 我们的过滤器几乎完全是数据库端的(因为它们由 FogBugz 搜索之外的各个方面使用),因此我们的搜索解析器将查询分为全文和非全文组件,执行查找并组合结果。这有点不幸,因为它使 Lucene 能够进行的许多有用的优化无效。

我们所做的事情有一些好处。管理帐户非常简单,因为客户数据及其索引存储在同一位置。不过,也存在一些负面影响,例如一组非常令人讨厌的边缘情况搜索,其性能低于我们的最低标准。回想起来,我们的搜索在当时很酷而且做得很好。然而,如果我再做一次,我会不鼓励这种做法.

简而言之,除非您的搜索领域非常特殊或者您愿意专门聘请开发人员进行极快的搜索,否则 ElasticSearch、Solr 或 Xapian 等优秀产品的性能可能会超过您。

如果我今天这样做,除非我的搜索域非常具体,否则我可能会使用ElasticSearch、Solr 或 Xapian对于我的数据库支持的全文搜索解决方案。至于哪一个,这取决于您的辅助需求(平台、查询类型、可扩展性、对一组怪癖相对于另一组怪癖的容忍度等)

关于一个大索引与许多(!)分散索引的主题:两者都可以工作。我认为这个决定实际上取决于您想要构建什么样的架构以及您需要什么样的性能。如果您认为 2 秒的搜索响应是合理的,那么您可以非常灵活,但是一旦您开始说超过 200 毫秒的任何内容都是不可接受的,您的选择很快就会开始消失。为所有客户维护一个大型搜索索引可能会带来更多好处高效的比处理大量小索引,它不一定更快(正如您所指出的)。我个人认为,在安全的环境中,保持客户数据分离的好处不容低估。当您的索引损坏时,它不会使所有搜索停止;而是会导致所有搜索停止。愚蠢的小错误不会暴露敏感数据;用户帐户保持模块化——更容易提取一组帐户并将它们放到新服务器上; ETC。

我不确定这是否回答了您的问题,但我希望我至少满足了您的好奇心:-)

[1]:2013 年,FogBugz 开始使用 ElasticSearch 增强其搜索和过滤功能。我们喜欢它。

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

如何为 B2B Web 应用程序设置 Lucene/Solr? 的相关文章

  • 比 BMH (Boyer–Moore–Horspool) 更快的算法

    您会使用哪种算法来搜索短文本中的短子字符串 简而言之 我的意思是子字符串有 5 10 个字符 字符串有 255 个字符 我正在考虑根据输入数据长度选择算法 哪种算法对于较长的输入更好 Try Turbo BM http www igm un
  • 当我使用完成建议器时,如何获得没有重复的独特建议?

    我在我的环境中使用弹性 5 1 1 我在字段名称上选择了完成建议器post hashtags带有一个字符串数组来提供建议 我收到前缀 inv 的响应如下 Req POST hashtag search pretty filter path
  • SOLR - Boost 函数 (bf) 以增加日期最接近 NOW 的文档的分数

    我有一个 solr 实例 其中包含具有 startTime 字段的文档 范围从上个月到一年后 我想添加一个提升查询 函数来提升 startTime 字段接近当前时间的文档的分数 到目前为止 我已经看到很多使用 rord 为较新的文档添加增强
  • Solr 突出显示是否还可以指示返回片段在原始字段内的位置或偏移量?

    背景 使用Solr 4 0 0 我已经对一组示例文档的文本建立了索引并启用了术语向量 以便我可以使用快速向量突出显示
  • SpatialQuery 使用 Lucene 进行基于位置的搜索

    我的 lucene 索引已索引纬度和经度字段 如下所示 doc Add new Field latitude latitude ToString Field Store YES Field Index UN TOKENIZED doc Ad
  • Solr 增量导入不起作用

    我使用的是solr 4 2 请注意 完全导入有效 但增量导入却无效 增量导入不会给出任何错误 但不会获取任何更改 这是数据配置文件
  • 如何统计lucene索引中每个文档的term数?

    我想知道 lucene 索引中每个文档的术语数量 我一直在 API 和互联网上搜索 但没有结果 你能帮助我吗 Lucene 的构建是为了回答相反的问题 即哪些文档包含给定术语 因此 为了获取文档的术语数量 您必须进行一些修改 第一种方法是存
  • 在 Solr 更新中指定多值术语频率?

    我有一个包含多值字段的 Solr 模式 我正在 Solr 外部解析文档并使用更新索引http wiki apache org solr UpdateJSON http wiki apache org solr UpdateJSON 也可以看
  • 使用 FTS 进行搜索相对于在索引列上使用 LIKE 进行搜索的性能有何提升)?

    质疑 全文搜索sql server 2005 https stackoverflow com questions 3627583 full text search sql server 2005 3824263 3824263 与在索引列上
  • 在休眠搜索中使用现有分析器AnalyzerDiscriminator

    Entity Indexed AnalyzerDefs AnalyzerDef name en tokenizer TokenizerDef factory StandardTokenizerFactory class filters To
  • PDO 和 MySQL 全文搜索

    我正在将所有站点代码从使用 mysql 函数转换为 PDO 关于 PDO 的 PHP 文档对于我的需求来说并不清楚 它为您提供了可以使用的功能 但没有详细解释它们在不同场景下的情况 基本上 我有一个 mysql 全文搜索 sql SELEC
  • Elasticsearch 与 Cassandra 对比 Elasticsearch 与 Cassandra

    我正在学习 NoSQL 并正在寻找满足客户要求之一的不同选项 在提出这个问题之前我已经查阅了各种资源 一个对NoSQL知之甚少的人 我需要以更快的速度存储数据并读取数据 完全故障安全且易于扩展 能够搜索数据进行分析 我最终得到了一个简短的清
  • 使用进度条时出错:Max 必须是正整数

    每当我用 solr 重新索引 a 时 都会收到以下错误 RAILS ENV development rake sunspot solr reindex Error using progress bar Max must be a posit
  • Elasticsearch 查询时间增加会产生顺序不足的结果

    给定搜索关键字的 ES 搜索结果one two three申请后好像出错了boost每个关键字的功能 请帮助我修改我的 错误 查询 以实现下面我所描述的 预期结果 我在ES1 7 4与卢塞恩4 10 4 提升标准 three 被认为是最重要
  • Solr 自定义相似度

    我想在我的 solr schema xml 中设置我自己的自定义相似度 但我在理解此功能时遇到一些问题 我想完全停用 solr 评分 tf idf coord 和 fieldNorm 我不知道从哪里开始 我知道的事情 我必须编写自己的 De
  • Solr 日期字段 tdate 与 date?

    所以我有一个关于 Solr 字段日期类型的问题 这个问题非常简单 日期 字段和 tdate 字段之间有什么区别 模式 xml 声称 为了更快的范围查询 请考虑 tdate 类型 和 基于 Trie 的日期字段 以实现更快的日期范围查询和日期
  • 在 VS Code 文件搜索中,我可以展开(或折叠)所有结果吗?

    在程序的 搜索 窗格中 按 Enter 键后 会列出所有文件 其中一些文件会展开以显示文件中的结果 而其他文件则会折叠 我首先想知道是什么决定了任何给定文件的扩展 其次我想知道如何一次性扩展所有文件 这个问题似乎最接近我的问题 但它是关于不
  • 不指定字段名查询Solr

    我是 Solr 的新手 我一定错过了一些东西 我在示例模式中还没有接触太多 我导入了一些示例数据 我也设置了LocalSolr 这似乎运作良好 我的问题只是查询Solr一般来说 我有一份文件 其中name字段设置为tom 我一直在查看配置文
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 是否可以为单个节点添加多个位置并且 solr 可以显示搜索的所有位置?

    场景 假设您在多个位置有一个产品 当您搜索该产品 而不是位置 时 您应该看到所有位置 在 Drupal 中 您可以使用多值字段来表示位置 但在 solr 中我不知道 当使用 solr 对产品进行索引时 您不应该仅发送一次 例如 3 次 并将

随机推荐