Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用ApacheLucene索引MySQL数据库,并保持它们的同步 在MySQL中添加新项时,它也必须由Lucene索引 当从MySQL中删除现有项时,它也必须从Lucene的索引中删除_Java_Mysql_Lucene_Synchronization_Indexing - Fatal编程技术网

Java 使用ApacheLucene索引MySQL数据库,并保持它们的同步 在MySQL中添加新项时,它也必须由Lucene索引 当从MySQL中删除现有项时,它也必须从Lucene的索引中删除

Java 使用ApacheLucene索引MySQL数据库,并保持它们的同步 在MySQL中添加新项时,它也必须由Lucene索引 当从MySQL中删除现有项时,它也必须从Lucene的索引中删除,java,mysql,lucene,synchronization,indexing,Java,Mysql,Lucene,Synchronization,Indexing,其思想是编写一个脚本,该脚本将通过调度程序(例如CRON任务)每隔x分钟调用一次。这是保持MySQL和Lucene同步的一种方法。到目前为止,我一直在努力: 对于MySQL中添加的每个新项目,Lucene也会对其进行索引 对于MySQL中已添加的每个项目,Lucene不会对其重新编制索引(没有重复的项目) 这就是我要请您帮助管理的要点: 对于之前添加的每个从MySQL中删除的项目,Lucene也应该取消其索引 下面是我使用的代码,它试图索引MySQL表标记(id[PK]| name): PS:此

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

  • 对于MySQL中添加的每个新项目,Lucene也会对其进行索引
  • 对于MySQL中已添加的每个项目,Lucene不会对其重新编制索引(没有重复的项目)
  • 这就是我要请您帮助管理的要点:

  • 对于之前添加的每个从MySQL中删除的项目,Lucene也应该取消其索引
  • 下面是我使用的代码,它试图索引MySQL表
    标记(id[PK]| name)

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

    编辑:

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

    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);
    }
    

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

    看看Solr DataImportScheduler方法。
    基本上,当web应用程序启动时,会产生一个单独的计时器线程,该线程会定期对Solr触发HTTP Post,然后Solr使用您设置的DataImportHandler从RDB(和其他数据源)提取数据


    因此,由于您没有使用Solr,而只使用Lucene,因此您应该考虑一些想法。

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

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

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


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

    您最终做了什么?
    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);
    }