使用 Apache Lucene 对 MySQL 数据库建立索引,并保持它们同步

2024-03-28

  1. 当MySQL中添加一个新项目时,它也必须被Lucene索引。
  2. 当现有项目从 MySQL 中删除时,它也必须从 Lucene 的索引中删除。

这个想法是编写一个脚本,通过调度程序(例如 CRON 任务)每 x 分钟调用一次。这是保持 MySQL 和 Lucene 同步的一种方法。到目前为止我所做到的:

  1. 对于 MySQL 中每一个新添加的项目,Lucene 也会对其进行索引。
  2. 对于 MySQL 中已添加的每个项目,Lucene 不会重新索引它(没有重复的项目)。

这就是我请求您帮助管理的一点:

  1. 对于每个先前添加的项目,然后从 MySQL 中删除,Lucene 也应该取消它的索引。

这是我使用的代码,它尝试为 MySQL 表建立索引tag (id [PK] | name):

public static void main(String[] args) throws Exception {

    Class.forName("com.mysql.jdbc.Driver").newInstance();
    Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/mydb", "root", "");
    StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);
    IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_36, analyzer);
    IndexWriter writer = new IndexWriter(FSDirectory.open(INDEX_DIR), config);

    String query = "SELECT id, name FROM tag";
    Statement statement = connection.createStatement();
    ResultSet result = statement.executeQuery(query);

    while (result.next()) {
        Document document = new Document();
        document.add(new Field("id", result.getString("id"), Field.Store.YES, Field.Index.NOT_ANALYZED));
        document.add(new Field("name", result.getString("name"), Field.Store.NO, Field.Index.ANALYZED));
        writer.updateDocument(new Term("id", result.getString("id")), document);
    }

    writer.close();

}

PS:此代码仅用于测试目的,无需告诉我它有多糟糕:)

EDIT:

一种解决方案可能是删除任何先前添加的文档,并重新索引所有数据库:

writer.deleteAll();
while (result.next()) {
    Document document = new Document();
    document.add(new Field("id", result.getString("id"), Field.Store.YES, Field.Index.NOT_ANALYZED));
    document.add(new Field("name", result.getString("name"), Field.Store.NO, Field.Index.ANALYZED));
    writer.addDocument(document);
}

我不确定这是最优化的解决方案,是吗?


只要您让索引/重新索引与应用程序分开运行,就会遇到同步问题。根据您的工作领域,这可能不是问题,但对于许多并发用户应用程序来说却是问题。

当我们有一个作业系统每隔几分钟运行一次异步索引时,我们遇到了同样的问题。用户可以使用搜索引擎找到产品,然后即使管理人员从有效产品堆栈中删除该产品,仍然可以在前端找到它,直到下一个重新索引作业运行。这会导致向一级支持报告非常混乱且很少可重现的错误。

我们看到了两种可能性:要么将业务逻辑与搜索索引的更新紧密连接,要么实现更紧密的异步更新任务。我们做了后者。

在后台,有一个类在 tomcat 应用程序内的专用线程中运行,该类获取更新并并行运行它们。后台更新到前端的等待时间缩短至0.5-2秒,大大减少了一级支持的问题。而且,它是尽可能松散耦合的,我们甚至可以实现不同的索引引擎。

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

使用 Apache Lucene 对 MySQL 数据库建立索引,并保持它们同步 的相关文章

  • 何时在 Springs @Configuration 中将 proxyBeanMethods 设置为 false?

    当查看 spring 自动配置时源代码 https github com spring projects spring boot tree master spring boot project spring boot autoconfigu
  • 如何在 El Capitan (OS X 10.11) 中设置 Android Studio?

    全新安装 El Capitan 10 11 尝试安装 Android Studio 版本 1 21 Error Android Studio was unable to find a valid JVM Please download it
  • 如何向正在运行的 Linux 进程发送 Ctrl-Break?

    我正在调试在 Sun 的 JDK 1 4 2 18 上运行的应用程序中的内存泄漏 该版本似乎支持命令行参数 XX HeapDumpOnCtrlBreak 这可能会导致 JVM 在遇到控制中断时转储堆 如何将其发送到 Linux 机器上的后台
  • 如何正确离开临界区?

    我有以下 C 代码 我在其中使用临界区对象 https msdn microsoft com en us library windows desktop ms682530 v vs 85 aspx EnterCriticalSection
  • 如何在 Apache POI 中获取 Excel 空白单元格值?

    我有一个巨大的 Excel 文件 其中包含大量列 如下所示 Column1 Column2 Column3 Column4 Column5 abc def ghi mno pqr 这是我编写的用于打印这些值的代码 try FileInput
  • java中使用[:punct:]函数的正则表达式

    我在用 punct 替换 a 中特殊字符的函数 字符串例如 REPLACE REGEXP REPLACE 第 1 列 punct 作为输出 作为java中SQL字符串的一部分 但我想要特定的特殊字符 不被替换 你能建议最好的方法吗 Acc
  • Android Studio 1.0.1 APK META-INF/DEPENDENCIES 中复制的重复文件

    我安装了 Android Studio 版本 1 0 1 并尝试将我的项目从 eclipse 导入到它 它给了我以下错误 Error Execution failed for task app packageDebug Duplicate
  • MySQL“GROUP BY NULL”是做什么的?

    我正在维护一些遗留代码 其中有一个我不理解的 SQL 查询 我希望这里有人可以向我解释这样做的目的 查询如下所示 select from product performance where merchantid 2151277 and cl
  • JavaFX 中的隐形舞台/场景

    我正在寻找一种隐藏 JavaFX 舞台或场景的方法 现在我知道了 hide 但这行不通 我需要一些仍然保留窗口的东西 但只是使其完全透明 一个很好的比喻是display none and visibility hidden在CSS中 第一个
  • 获取两个表中某段时间内SUM数量的数据

    我有下面两张表 订单详细信息 OrderNumber quantityordered priceEach Orders OrderNumber orderDate 问题 orderDate 看起来像这样 2005 01 01 2005 02
  • LDAP中超时的实现

    我一直在处理我们正在使用的应用程序LDAP获取用户详细信息 有时获取用户详细信息需要更多时间 我想实施time out获取详细信息的方法 以便我们可以避免在最坏的情况下在服务器中挂起事务 这里我们使用的是LdapUtil我们在其中配置的类L
  • 如何使用 Java 以编程方式登录 Facebook?

    我正在尝试编写一个可以自动登录 Facebook 的 Java 程序 到目前为止 我已经得到了以下代码 可以将主页 html 页面下载到字符串中 但不知道如何发送电子邮件和密码来登录 Facebook Java 程序还需要处理返回的 coo
  • java SWT透明复合背景

    我有复合对象 Composite composite new Composite shell SWT NONE composite setBounds new Rectangle 10 10 100 100 我如何使这个组合具有透明背景 我
  • 具有自定义字段名称的 RavenDB 查询索引

    我在 RavenDB 中收集了 Message 文档 定义 class Message string Content Tag Tags class Tag string Value 我有索引 from doc in docs Message
  • Spring 如何在登录网址上设置动态前缀

    我有一个始终以动态前缀开头的 Spring 应用程序 这是因为我需要该前缀来进行一些内部配置 问题是 当我尝试设置登录页面时 无法传递该前缀并使其工作 如何为我的登录页面设置动态前缀 这是我的 AppController 的一部分 我在其中
  • 课程完成时更新外部数据库

    我的场景 Moodle 中的用户完成了一门课程 一旦发生这种情况 我想更新外部数据库 我的理解是 每次运行 cron 作业时都会触发 course completed 事件 使用一些简单值 例如已完成课程的用户名 ID 课程 ID 以及完成
  • Ionic框架和php mysql

    我是 Ionic Apahce Cordova 的新手 我创建了一个简单的应用程序 它具有静态列表视图项 但我想从 MYSQL 表获取数据并将其替换到我的静态列表中 我用谷歌搜索了一下 有人在研究它 但我不知道应该把我的 php 文件放在哪
  • 什么是排列索引?

    我正在阅读 加速 C 我不明白练习 5 1 设计并实现一个程序 根据以下输入生成排列索引 排列索引是其中每个短语由短语中的每个单词索引的索引 The quick brown fox jumped over the fence The qui
  • PHP MySQL 检查表是否有主键

    我将查询 MySQL 服务器来检查表是否有主键 就像是 if mysql send SELECT TABLE table HAS PRIMARY KEY TRUE do stuff here SHOW INDEXES FROM TABLE
  • 当考虑性能时如何从文件中读取整数?

    我正在 CodeEval 上执行一些任务 基本上任务非常简单 打印出从文件中读取的所有整数的总和 我的解决方案如下 import java io File import java io IOException import java io

随机推荐

  • 等待主线程直到 ExecutorService 的所有线程池任务完成?

    我需要主线程等待所有线程池任务完成 怎么做 例如 我有程序 public static void main String args ExecutorService executor Executors newFixedThreadPool
  • Android JNI:调用 System.loadLibrary() 会导致 SEGV [重复]

    这个问题在这里已经有答案了 可能的重复 应用程序可以在 Eclipse 中调试 运行 但 APK 在解析包含自定义视图的 XML 布局时给出 classNotFoundException https stackoverflow com qu
  • 如何打包 Visual Studio aws 无服务器项目?

    我试图弄清楚是否有一种方法可以以自动化的方式打包 aws 无服务器项目 以便我们可以拆分构建和发布管道 使用dotnet lambda命令行工具 我可以看到有一个dotnet lambda package命令将 lambda 打包为 zip
  • 在 php 中集成 payfort api 时遇到问题

    我正在关注 https docs start payfort com references api https docs start payfort com references api 实施 Payfort 付款 Api 的文档 但我遇到
  • Kendo 自动完成显示两个建议列表

    我的 Kendo 自动完成控件成功检索 Json 列表 不幸的是 它调用了 MVC 控制器方法两次并创建了两个建议列表 重复列表直接显示在第一个列表后面 当从第一个建议列表中选择一个值时 该列表会消失 但重复列表仍然可见 我正在使用自动完成
  • Angular“=”范围不适用于驼峰命名法

    我是指令的范围属性 我使用时效果很好show作为属性名称 span span
  • 如何在 pip 安装期间编译 C++ 依赖项?

    我想让我的 python 代码可以使用 pip 但是 我的代码依赖于另一个不可 pip 的库 所以 当用户调用时我需要以某种方式编译源代码pip install 我怎样才能做到这一点 我无法通过简单的谷歌搜索找到好的参考资料 我建议看看 l
  • 使用请求对象 Flask 获取 json 响应

    网络服务 app route get details def getDetails cur execute select from employee rows cur fetchall columns desc 0 for desc in
  • CSS / HTML 导航和徽标位于同一行

    我不知道如何将它们放在同一条线上 http codepen io anon pen dovZdQ http codepen io anon pen dovZdQ div class navigation bar div img src lo
  • 如何修复/调整 ggplot geom_tile 中每个带的宽度

    这是我的问题的示例数据 sampledata lt matrix c 1 60 1 60 rep 0 1 each 60 sample 1 3 120 replace T ncol 3 colnames sampledata lt c Ti
  • 如何进行递归子文件夹搜索并返回列表中的文件?

    我正在编写一个脚本 以递归方式遍历主文件夹中的子文件夹并构建特定文件类型的列表 我的脚本有问题 目前设置如下 for root subFolder files in os walk PATH for item in files if ite
  • Jquery AJAX:服务器端验证失败时如何显示Flash错误消息?

    我正在使用 Jquery 表单插件通过 ajax 提交表单 我已经在我的模型中的服务器端设置了验证 现在 当验证失败时 我想使用 ajax 向用户显示相同的 flash error 消息 如果验证成功 我可以显示 flash notice
  • Xcode 卡在索引上

    我已经工作了两个月的项目无缘无故停止工作 因为 Xcode 卡在 索引 上 我无法再构建该项目了 如果我尝试构建 Xcode 就会冻结 我必须强制退出 这种情况仅发生在该项目中 我尝试清理所有派生数据 但没有帮助 我正在使用 Xcode 4
  • jqgrid 更改单元格值并保持编辑模式

    我在网格中使用内联编辑 在某些情况下我想更改列内单元格的值 我用 setCell 更改它 效果很好 我的问题是 更改后 单元格失去了编辑模式 而该行的所有其他单元格都处于编辑模式 我想在更改单元格后将其保持在编辑模式 现在我所做的是保存该行
  • 种子中的 DHT

    我正在编写一个 P2P 实现 我希望将其去中心化 然而我在掌握如何做时遇到了一些困难DHT https en wikipedia org wiki Distributed hash table在像 BitTorrent 这样的协议中是有效的
  • 帮助正确计算atan2

    我需要计算线之间的角度 我需要计算atan 所以我正在使用这样的代码 static inline CGFloat angleBetweenLinesInRadians2 CGPoint line1Start CGPoint line1End
  • python中“追加”和“+”有什么区别? [复制]

    这个问题在这里已经有答案了 我不知道有什么区别f and g 功能中f 每当调用函数时 列表 L 就会累积 但在功能上g 它不是 def f a L L append 2 print L def g a L L L 2 print L pr
  • SQL Server 2008中的递归同表查询

    我在 SQL Server 2008 数据库中有下表 Id Name ParentFolder 1 Europe NULL 2 Asia NULL 3 Germany 1 4 UK 1 5 China 2 6 India 2 7 Scotl
  • echo 函数跳转到 Div 之外

    我创建了一个用于 gettext 翻译的函数 该函数位于头文件中 function ex text echo gettext text 当我使用函数 ex 时它会翻译该函数中的任何文本 效果很好 尽管当我在另一个内部有 div 的函数中使用
  • 使用 Apache Lucene 对 MySQL 数据库建立索引,并保持它们同步

    当MySQL中添加一个新项目时 它也必须被Lucene索引 当现有项目从 MySQL 中删除时 它也必须从 Lucene 的索引中删除 这个想法是编写一个脚本 通过调度程序 例如 CRON 任务 每 x 分钟调用一次 这是保持 MySQL