在具有多个 Web 服务器的现有 .NET / SQL Server 堆栈上实施 Lucene

2024-04-30

我想考虑使用 Lucene 为我当前管理的网站提供全文搜索解决方案。该网站完全基于 SQL Server 2008 / C# .NET 4 技术构建。我要索引的数据实际上非常简单,每个记录只有几个字段,并且只有其中一个字段实际上是可搜索的。

我不清楚我需要使用的最佳工具集是什么,或者我应该使用的架构是什么。具体来说:

  1. 我应该把索引放在哪里?我见过有人建议将其放在网络服务器上,但这对于大量网络服务器来说似乎是浪费。集中化在这里肯定会更好吗?

  2. 如果索引是集中式的,鉴于它仅存在于文件系统上,我将如何查询它?我是否必须有效地将其放在所有网络服务器都可以看到的网络共享上?

  3. 是否有任何预先存在的工具可以按计划增量填充 Lucene 索引,从 SQL Server 数据库中提取数据?我在这里推出自己的服务会更好吗?

  4. 当我查询索引时,我是否应该只提取一堆记录 ID,然后返回到数据库以获取实际记录,或者我应该直接从索引中提取搜索所需的所有内容?

  5. 在这种风味环境中尝试实现像 Solr 这样的东西是否有价值?如果是这样,我可能会给它它自己的 *nix VM 并在 Tomcat 中运行它。但我不确定在这种情况下 Solr 会给我买什么。


我会根据我们选择的实施方式来回答一些Lucene.Net 在 Stack Overflow 上 https://blog.stackoverflow.com/2011/01/stack-overflow-search-now-81-less-crappy/,以及我一路上学到的一些教训:

我应该把索引放在哪里?我见过有人建议将其放在网络服务器上,但这对于大量网络服务器来说似乎是浪费。集中化在这里肯定会更好吗?

  • 这取决于你的目标,我们有一个severely未充分利用的 Web 层(~10% CPU),以及进行全文搜索的超载数据库(大约 60% CPU,我们希望它更低)。加载相同的索引each网络层让我们利用这些机器并拥有大量冗余,如果需要,我们仍然可以失去十分之九的 Web 服务器并保持 Stack Exchange 网络正常运行。这样做有一个缺点,它对我们来说是 IO(读取)密集型的,并且购买 Web 层时并没有考虑到这一点(大多数公司通常都是这种情况)。虽然它工作正常,但我们仍然会将我们的 Web 层升级到 SSD,并实现 .Net 端口中遗漏的一些其他位,以弥补这种硬件缺陷(NIOFSDirectory例如)。
  • 如果我们索引所有数据库,另一个缺点nWeb 层的时间,但幸运的是,我们并不缺乏网络带宽,而且 SQL Server 缓存结果使得每次增量索引操作都非常快。对于大量的 Web 服务器,仅此一项就可能消除此选项。

如果索引是集中式的,鉴于它仅存在于文件系统上,我将如何查询它?我是否必须有效地将其放在所有网络服务器都可以看到的网络共享上?

  • 您可以通过任何一种方式在文件共享上查询它,只需确保一次只有一个正在建立索引(write.lock,目录锁定机制将确保这一点,并在您一次尝试多个 IndexWriter 时出错)。
  • 请记住我上面的注释,当很多读者飞来飞去时,这是 IO 密集型的,因此您的商店需要足够的带宽,至少缺少 iSCSI 或光纤 SAN,我会谨慎对待这种方法高流量(每天数十万次搜索)使用。
  • 另一个考虑因素是如何更新/警告您的网络服务器(或查询它的任何层)。完成索引传递后,您需要重新打开IndexReaders 获取新文档的更新索引。我们使用一个Redis消息通道 http://redis.io/topics/pubsub提醒任何关心索引已更新的人...任何消息传递机制都可以在这里工作。

是否有任何预先存在的工具可以按计划增量填充 Lucene 索引,从 SQL Server 数据库中提取数据?我在这里推出自己的服务会更好吗?

  • 不幸的是,据我所知,没有,但我可以与您分享我是如何处理这个问题的。
  • 当索引特定表(类似于 Lucene 中的文档)时,我们添加了行版本 http://msdn.microsoft.com/en-us/library/ms182776.aspx到那张桌子。当我们索引时,我们根据最后一个行版本(a时间戳 http://msdn.microsoft.com/en-us/library/ms182776.aspx数据类型,作为bigint http://msdn.microsoft.com/en-us/library/ms187745.aspx)。我选择通过一个简单的 .txt 文件在文件系统上存储最后一个索引日期和最后一个索引行版本,原因之一是:Lucene 中的其他所有内容都存储在那里。这意味着如果出现大问题,您可以删除包含索引的文件夹,下一个索引过程将恢复并具有完全最新的索引,只需添加一些代码来处理不存在的内容,这意味着“索引所有内容” 。

当我查询索引时,我是否应该只提取一堆记录 ID,然后返回到数据库以获取实际记录,或者我应该直接从索引中提取搜索所需的所有内容?

  • This really取决于您的数据,对于我们来说,将所有内容存储在索引中实际上并不可行(也不建议这样做)。我建议您将搜索结果的字段存储在索引中,我的意思是您需要什么present在用户单击转到完整的[在此处插入类型]之前,您的搜索结果会显示在列表中。
  • 另一个考虑因素是数据更改的频率。如果你有很多领域not搜索的内容正在快速变化,您需要重新索引这些行(文档)来更新索引,而不仅仅是当您搜索的字段发生变化时。

在这种风味环境中尝试实现像 Solr 这样的东西是否有价值?如果是这样,我可能会给它它自己的 *nix VM 并在 Tomcat 中运行它。但我不确定在这种情况下 Solr 会给我买什么。

  • 当然有,这就是您所说的集中式搜索(搜索次数较多时,您可能会再次达到虚拟机设置的限制,请密切关注)。我们没有这样做,因为它在我们的技术堆栈和构建过程中引入了很多(我们认为)不必要的复杂性,但对于大量的 Web 服务器来说,它使得much更有意义。
  • 它给你买了什么?主要是性能和专用索引服务器。代替n服务器爬行网络共享(也竞争 IO),它们可以访问单个服务器only处理网络上的请求和结果,而不是抓取索引,因为索引会来回传输更多数据......这将是 Solr 服务器上的本地数据。此外,由于索引服务器较少,因此您不会频繁访问 SQL 服务器。
  • What it doesn't买你的也是同样多的冗余,但这取决于你有多重要。如果您可以在降级搜索或没有降级搜索的情况下正常运行,只需让您的应用程序处理即可。如果你can't,那么备份 Solr 服务器或更多服务器也可能是一个有效的解决方案......并且可能需要维护另一个软件堆栈。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在具有多个 Web 服务器的现有 .NET / SQL Server 堆栈上实施 Lucene 的相关文章

  • Oracle 删除约束级联等效于 Sql Server

    在Oracle中 删除约束PK SAI我使用语法 ALTER TABLE SAISIE DROP CONSTRAINT PK SAI CASCADE SQL Server 中与此等效的是什么 您正在考虑与实际 DELETE 语句相关的 FO
  • SQL Server 大小写/排序规则问题

    今天我在客户数据库中遇到了一个奇怪的情况 SQL Server 2005 数据库排序规则不区分大小写 因此我可以使用任何大小写编写 SQL 查询 没有任何问题 除了一个 一张特定表中的一个特定列称为 DeadZone 如果我这样查询 从表名
  • WCF WebHttp 混合身份验证(基本和匿名)

    所有这些都与 WebHttp 绑定有关 托管在自定义服务主机中 IIS 目前不是一个选项 我已经实现了自定义 UserNamePasswordValidator 和自定义 IAuthorizationPolicy 当我将端点的绑定配置为使用
  • Asp.net core默认路由

    简化版Startup code public void ConfigureServices IServiceCollection services services AddMvc public void Configure IApplica
  • 通过 SOAP 的 Gmt php 或 UTC C# 等效项

    is C DateTime UtcNow和 PHPdate c 是等价的 我怀疑 因为当我肥皂时 我得到了 C
  • .pdbs 会减慢发布应用程序的速度吗?

    如果 dll 中包含 pdb 程序调试 文件 则行号将出现在引发的任何异常的堆栈跟踪中 这会影响应用程序的性能吗 这个问题与发布与调试 即优化 无关 这是关于拥有 pdb 文件的性能影响 每次抛出异常时都会读取 pdb 文件吗 加载程序集时
  • 合并sql中的列

    我正在使用 SQL Server 2017 有一个存储过程 其中我有一个带有连接的简单选择 例如 SELECT p legacyKey AS JobNumber p Name AS JobName G Label AS DesignStat
  • RegularExpressionValidator.ValidationExpression 强制长度为 10 或 12 个符号

    RegularExpressionValidator ValidationExpression d 10 仅表示数字 最多 10 位 RegularExpressionValidator ValidationExpression d 10
  • 如何使用 System.Net.Mail 将电子邮件发送到多个地址

    我有 smtp 电子邮件功能 它适用于单个地址 但在多个地址中存在问题 我使用以下代码行传递多个地址 MailAddress to new MailAddress email protected cdn cgi l email protec
  • 如何使用 WebResponse 下载 .wmv 文件

    我使用以下代码通过 WebResponse 获取 wmv 文件 我正在使用一个线程来调用这个函数 static void GetPage object data Cast the object to a ThreadInfo ThreadI
  • 获取 System.Drawing.Font 宽度?

    我正在使用 Net 工具进行一些 2D 绘图 System Drawing Font uses a GetHeight 返回以像素为单位的高度 我缺少一个GetWidth 检索宽度 我应该用什么 Use Graphics MeasureSt
  • SQL Server 抱怨无效的 json

    我正在使用 Azure 数据工厂和 Azure SQL 数据库编写 ETL 工具 数据工厂捕获映射数据流的输出并将其作为字符串插入到 SQL Server 表 Audit OperationsEventLog 的 StatusMessage
  • 如何为 LINQ 查询构建动态 FROM 子句?

    我有一个标准 LINQ 查询 var list from x in SomeDataContext ViewName where Rest of where clause select x 我想知道是否可以构建动态 LINQ 查询 以便我可
  • 在 .Net 应用程序中使用 Active Directory Web 服务

    我正在尝试构建一个 Net 应用程序来询问 Active Directory 编辑 我需要使用 Web 服务来执行此操作 因为我将使用需要使用 Web 服务的第三方工作流工具从 Sharepoint 工作流与 AD 进行通信 根据我的研究
  • 如何在c#中生成8字节GUID值? [复制]

    这个问题在这里已经有答案了 可能的重复 如何从 GUID 生成 8 字节唯一 ID https stackoverflow com questions 5678177 how to generate 8 bytes unique id fr
  • 如何在没有 Startup 类的情况下以编程方式启动 .NET 6 最小 API

    我正在尝试对我们的提供商项目实施 PactNet 合同测试 然而问题是 我们使用的是 Minimal API 因此我们没有将 Startup cs 和 Program cs 类全部整合到一个 Program cs 中 这提出了一个问题 因为
  • TSQL - 生成文字浮点值

    我理解比较浮点数时遇到的许多问题 并对它们在这种情况下的使用感到遗憾 但我不是表格作者 只有一个小障碍需要克服 有人决定使用浮点数 就像您期望使用 GUID 一样 我需要检索具有特定浮点值的所有记录 sp help MyTable Colu
  • Python tkinter.filedialog Askfolder 干扰 clr

    我主要在 Spyder 中工作 构建需要弹出文件夹或文件浏览窗口的脚本 下面的代码在spyder中完美运行 在 Pycharm 中 askopenfilename工作良好 同时askdirectory什么都不做 卡住了 但是 如果在调试模式
  • SQL Server - 将行连接到逗号分隔的列表中

    假设我有一个临时表 如下所示 Id Value 1 1 1 2 1 3 2 1 2 2 我希望我的桌子是这样的 Id ValueList 1 1 2 3 2 1 2 所以基本上我需要将我的值分组为逗号分隔的列表 我已经尝试过以下操作 SEL
  • .NET UI 元素线程限制的原因

    我们知道 除了实例化元素的线程之外 不可能从任何线程执行操作任何 UI 元素属性的代码 我的问题是 为什么 我记得当我们使用 COM 用户界面元素时 在 COM Visual Basic 6 0 时代 所有 UI 元素都是使用 COM 类和

随机推荐

  • shouldChangeCharactersInRange 在 Swift 中如何工作?

    我在用着应该改变范围内的字符作为使用即时类型搜索的一种方式 然而我有一个问题 应该改变范围内的字符在文本字段实际更新之前被调用 在 Objective C 中 我使用以下方法解决了这个问题 BOOL textField UITextFiel
  • 在 SQL 存储过程中选择并合并表中的行

    有一个具有架构的临时表 ID 序列号 姓名 ID 不唯一SeqNo 整数 可以是 1 2 或 3 以ID SeqNo作为主键排序名称 任何文本 表中的示例数据如下 1 1 RecordA 2 1 RecordB 3 1 RecordC 1
  • 如何将 Jar 库添加到 IntelliJ Idea SBT Scala 项目?

    我创建了一个 IntelliJ Idea SBT Scala 项目 例如海科 西伯格的文章 http heikoseeberger blogspot com 2010 08 how to setup scala project with s
  • 用 CSS 设置背景图像的大小?

    可以用CSS设置背景图片的大小吗 我想做类似的事情 background url bg gif top repeat y background size 490px 但这样做似乎是完全错误的 CSS2 如果需要放大图像 则必须在图像编辑器中
  • jquery中元素+ ID vs 只有ID?

    div some id将扫描整个 DOM 中的所有 div some id将直接从 DOM 获取 ID 那么哪个更快呢 div some id or some id See 优化选择器 https learn jquery com perf
  • Azure 搜索 .NET SDK 自定义分析器

    没有太多背景 这是我的问题 要使用 C 中的 NET SDK 创建新的 Azure 搜索索引 使用文档中提供的酒店示例 我的代码如下所示 public class Hotel System ComponentModel DataAnnota
  • adb 可以检测的设备数量是否有上限

    我想知道 android adb 工具可以检测的设备数量是否有最大限制 我在谷歌上没有找到任何答案 我已经成功连接了 13 台设备 但我不知道它是否仍然适用于更多设备 Thanks 似乎没有 adb 限制 但有一个 USB 控制器限制 具体
  • IOS内存中存储userid

    我做了一个带有登录功能的IOS应用程序 我使用 ASIHTTPRequest 来检查用户是否存在于 MySQL 数据库中 一切正常 但我想通过其他视图控制器传递用户 ID 或在应用程序的其他部分检索它 有人可以推动我朝着正确的方向前进 如何
  • ConfigParser 从 INI 文件中获取值,如下所示

    我有以下类型的 INI 文件 section1 subsection1 port 989 section1 subsection2 somethign somethign 我正在使用 Python 的 ConfigParser 来解析 IN
  • 在不同节点上运行 Jenkins stage

    我有以下多分支管道架构的 Jenkinsfile usr bin groovy pipeline agent node label ubuntu customWorkspace src BUILD NUMBER environment SR
  • VBA Excel:将条件格式应用于空白单元格

    我正在尝试编写一个子过程 它将一些条件格式应用于 Excel 中的一系列单元格 我有点卡住了 所以我使用了宏录制器 然而 我无法弄清楚为什么它应用下面的公式 并且当我手动运行代码时它失败了 我想要做的是将条件格式应用于范围内的空白单元格 我
  • 在 Golang Server 中接受持久的 tcp 连接

    我正在尝试使用 Go 并且想创建一个 TCP 服务器 我可以通过 telnet 访问该服务器 发送命令并接收响应 const CONN HOST localhost CONN PORT 3333 CONN TYPE tcp func mai
  • Linux 中 NDIS 过滤器的类似物是什么?

    我正在研究一个as close to real time我在linux中尽可能地使用系统 并且需要在收到特定数据包后立即发送大约600 800字节的TCP数据包 为了获得最佳的延迟 我希望这个数据包直接从内核发送 而不是将接收到的数据包一直
  • 在 LibGDX 中保存和检索图像文件

    如何在 LibGDX 中保存和检索图像文件 我想将图像文件保存在 AndroidApplication 类的本地存储中 并在我的 Core 项目中检索它 Libgdx 中的文件处理在libGDX 维基 https github com li
  • 如何获取字段类型的零值

    我有一个包含许多字段的结构 我已经弄清楚如何使用反射提取字段名称 值和标签信息 我还想做的是确定字段的值是否与字段的默认值不同 目前 我有这个 有效 但有点臭 qsMap make map string interface var defa
  • Android WebView无法正确显示网页

    我有这样的简单 WebView 代码 WebView wv WebView findViewById R id webview1 wv loadUrl http en wikipedia org wiki Book 但显示的页面显示维基百科
  • R 在警告后执行某些操作(例如 tryCatch 警告,然后编辑对象)

    我正在运行一堆 logit 模型 其中一些模型具有完美的分离 会返回 glm 警告 这是显示问题的数据集 DT lt iris str DT DT binary lt as numeric DT Petal Width gt 1 DT du
  • 删除不需要的空行 Eclipse 编辑器

    当我在 eclipse 中打开任何文件时 它在所有代码行和空白行之后显示替代空白行 我怎样才能删除它 In eclipse preference setting you can remove all the unwanted blank l
  • 多种语言如何在一个项目中交互?

    我听说有些人在一个项目中使用多种语言进行编程 我无法想象这些语言如何相互作用 我的意思是没有像这样的Java方法 myProgram callCfunction parameters 从来没有发生过还是我错了 在一个项目中使用多种语言实际上
  • 在具有多个 Web 服务器的现有 .NET / SQL Server 堆栈上实施 Lucene

    我想考虑使用 Lucene 为我当前管理的网站提供全文搜索解决方案 该网站完全基于 SQL Server 2008 C NET 4 技术构建 我要索引的数据实际上非常简单 每个记录只有几个字段 并且只有其中一个字段实际上是可搜索的 我不清楚