索引队列

在应用程序中添加了搜索扩展组件后,会开始自动 监控实体的修改。本章节我们介绍如何设置使用最新的数据自动更新 ES 索引。

跟踪修改的机制会在 SEARCH_INDEXING_QUEUE 数据库表保存对修改后实体操作的队列。IndexingQueueManager bean 包含处理队列的方法,并将修改的数据发送至 ES。

应设置索引队列的定期处理机制,否则搜索将返回过时的数据。

如需实现定期队列处理,可以按照下面的介绍使用 Quartz 任务调度。

默认 Quartz 配置

搜索扩展组件提供一个预定义的 Quartz 任务配置,用于定期处理索引队列。按下列步骤启用:

  1. 按照 Quartz 章节的说明在项目中安装 安装 扩展组件。

  2. 按需修改 CRON 表达式。默认值为 0/5 * * * * ?(5 秒一次)。

    jmix.search.indexingQueueProcessingCron = 0/10 * * * * ?

默认配置创建并设置 id 为 IndexingQueueProcessing 的调度计划。

自定义 Quartz 配置

如需使用自定义 Quartz 配置,请按照下列步骤:

  1. 按照 Quartz 章节的说明在项目中安装 安装 扩展组件。

  2. application.properties 文件添加下列应用程序属性禁用默认配置:

    jmix.search.useDefaultIndexingQueueProcessingQuartzConfiguration = false
  3. 创建自定义任务类,调用 IndexingQueueManager.processNextBatch()

    public class MyCustomQueueProcessingJob implements Job {
    
        @Autowired
        private IndexingQueueManager indexingQueueManager;
    
        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
            indexingQueueManager.processNextBatch();
        }
    }
  4. 应用程序运行时,可以在 Quartz → Quartz jobs 视图中为 MyCustomQueueProcessingJob 类配置调度任务。

  5. 或者,如需在开发时配置调度任务,可以在主程序类中注册下列 bean:

    @Bean
    JobDetail myCustomIndexingQueueProcessingJob() {
        return JobBuilder.newJob()
                .ofType(IndexingQueueProcessingJob.class)
                .storeDurably()
                .withIdentity("MyCustomIndexingQueueProcessing")
                .build();
    }
    
    @Bean
    Trigger myCustomIndexingQueueProcessingTrigger() {
        return TriggerBuilder.newTrigger()
                .forJob(myCustomIndexingQueueProcessingJob())
                .startNow()
                .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
                .build();
    }