全文索引----solr服务器更新增量索引

article/2025/10/9 15:22:39

 

   上篇文章我们介绍了全量更新solr索引,但是在数据量较大时,频繁的更新索引会消耗系统性能,如果更新频率较低,则会影响短时的数据准确性,所以,更新时间的间隔是个很难界定。增量索引解决了这个问题,我们可以在较短的时间内只更新那些变化的数据,这样就避免了大批量的数据更新,因为数据量小,我们可以设置较短的时间间隔,大幅度的提高了用户体验度。本文介绍增量索引。
    一 配置数据源
    1.1 数据库

 

    为了便于同全量索引比较,我们使用同一个数据库和数据表。增量索引的关键是找到那些修改的数据,所以需要添加一个标识符,数据类型是时间戳,字段命名为updateTime,即四个字段,id,title,content,updateTime,其中updateTime数据类型为TimeStamp,默认值为CURRENT_TIMESTAMP.结构如下:

 

    solr本身提供了一个last_index_time,这个字段记录了每条记录导入的时间(包括增量和全量导入),我们只需要将updateTime和last_index_time比较即可得到上一次索引更新以后变化的记录。
    1.2 配置data-config.xml
    全量索引继续保留,所以原来的配置不需要修改,我们只需要添加增量索引的配置。首先,我们在索引中用到了updateTime字段,所以需要添加updateTime字段的索引;其次,增量索引的关键就是找到更新的那些数据,通过上边分析,我们首先需要使用last_index_time字段找到更新的记录代码如下:

 

deltaQuery="select id from blog where updateTime > '${dataimporter.last_index_time}'"


最后,我们根据获得的id更新索引即可,代码如下:

 

deltaImportQuery="select * from blog where id='${dih.delta.id}'"


最终的配置如下:

 

<dataConfig><dataSource name="jfinal_demo" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" 
    url="jdbc:mysql://192.168.21.20:3306/jfinal_demo" user="root" password="123456" batchSize="-1" /><document name="testDoc"><entity name="blog" dataSource="jfinal_demo" pk="id" query="select * from blog"deltaImportQuery="select * from blog where id='${dih.delta.id}'"deltaQuery="select id from blog where updateTime > '${dataimporter.last_index_time}'"><field column="id" name="id"/><field column="title" name="title"/><field column="content" name="content"/><field column="updateTime" name="updateTime"/></entity></document>
</dataConfig>


    data-config.xml中一些属性说明:
        transformer 格式转化:HTMLStripTransformer 索引中忽略HTML标签
        query:查询数据库表符合记录数据
        deltaQuery:增量索引查询主键ID,注意这个只能返回ID字段   
        deltaImportQuery:增量索引查询导入的数据
        deletedPkQuery:增量索引删除主键ID查询,注意这个只能返回ID字段   

    1.3 配置schema.xml

 

    在全量索引的基础上,我们只需要添加updataTime字段的索引即可,代码如下:

 

 

<field name="id" type="text_general" indexed="true" stored="true" />  
<field name="title" type="text_general" indexed="true" stored="true" />  
<field name="content" type="text_general" indexed="true" stored="true" />
<field name="updateTime" type="text_general" indexed="true" stored="true" />

 

 

    1.4 修改数据库,产生数据源
    我们直接修改数据库中的一条记录,提供增量索引数据,修改如下:


    二 通过solr Admin客户端更新索引

 

 

    2.1 更新操作如下:

 

    2.2 结果测试

 

    说明:使用solr Admin客户端方式,简单,快捷,直观性强,适用于数据测试。
    三 使用http请求更新索引
    3.1 原理
    我们前文已经介绍过原理,这里不再赘述。前文连接:点击打开链接
    3.2 实现

 

    我们继续使用HttpURLConnection对象来完成http请求,代码如下:

 

    /** * 访问URL,全量索引 */  public static Boolean runHttpGet(){  Boolean flag = false;  //设置请求的路径    String strUrl="http://192.168.22.216:8983/solr/dataimport?command=delta-import";    //将请求的参数进行UTF-8编码,并转换成byte数组=    try {    //创建一个URL对象    URL url=new URL(strUrl);    //打开一个HttpURLConnection连接    HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();    //设置连接超时的时间    urlConn.setDoOutput(true);    //在使用post请求的时候,设置不能使用缓存    urlConn.setUseCaches(false);    //设置该请求为post请求    urlConn.setRequestMethod("GET");    urlConn.setInstanceFollowRedirects(true);    //配置请求content-type    urlConn.setRequestProperty("Content-Type", "application/json, text/javascript");    //执行连接操作    urlConn.connect();    //发送请求的参数    DataOutputStream dos=new DataOutputStream(urlConn.getOutputStream());    dos.flush();  dos.close();  if(urlConn.getResponseCode()==200){  flag = true;  //显示    InputStreamReader isr = new InputStreamReader(urlConn.getInputStream(), "utf-8");  int i;       String strResult = "";       // read       while ((i = isr.read()) != -1) {       strResult = strResult + (char) i;  }  //System.out.println(strResult.toString());  isr.close();       }  } catch (Exception e) {    e.printStackTrace();    }    return flag;  }

 

 

    等同前文,使用此方法,也可以使用quartz做任务调度,代码不再示范。

 

    3.3 结果测试

 

    四 使用官方Scheduler实现索引更新
    4.1 jar包配置
    下载apache-solr-dataimportscheduler-1.0.jar放到Tomcat的webapps的solr目录的WEB-INF的lib目录下。
    4.2 修改solr的WEB-INF目录下的web.xml文件,为<web-app>元素添加一个子元素,

 

<pre name="code" class="html"><listener>    <listener-class>    org.apache.solr.handler.dataimport.scheduler.ApplicationListener    </listener-class>    
</listener> 
</pre><pre>

    4.3 修改配置文件dataimport.properties:

    在SOLR_HOME\solr目录下面新建一个目录conf(注意不是SOLR_HOME\solr\collection1下面的conf),然后用解压文件打开apache-solr-dataimportscheduler-1.0.jar文件,将里面的dataimport.properties文件拷贝过来,进行修改,下面是最终我的自动定时更新配置文件内容:

 

#################################################  
#                                               #  
#       dataimport scheduler properties         #  
#                                               #  
#################################################  #  to sync or not to sync  
#  1 - active; anything else - inactive  
syncEnabled=1  #  which cores to schedule  
#  in a multi-core environment you can decide which cores you want syncronized  
#  leave empty or comment it out if using single-core deployment  
syncCores=core1,core2  #  solr server name or IP address  
#  [defaults to localhost if empty]  
server=localhost  #  solr server port  
#  [defaults to 80 if empty]  
port=8080  #  application name/context  
#  [defaults to current ServletContextListener's context (app) name]  
webapp=solr  #  URL params [mandatory]  
#  remainder of URL  
params=/dataimport?command=delta-import&clean=false&commit=true  #  schedule interval  
#  number of minutes between two runs  
#  [defaults to 30 if empty]  
interval=1  #  重做索引的时间间隔,单位分钟,默认7200,即5天;   
#  为空,为0,或者注释掉:表示永不重做索引  
reBuildIndexInterval=7200  #  重做索引的参数  
reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true  #  重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;  
#  两种格式:2012-04-11 03:10:00 或者  03:10:00,后一种会自动补全日期部分为服务启动时的日期  
reBuildIndexBeginTime=03:10:00

 

 

    五 索引删除
    5.1 概述
    在solr的使用过程中或者测试时,会产生一些脏数据,我们需要及时的删除这些脏数据,小编一solr Admin客户端介绍如何删除或清空索引。

 

 

    5.2 操作

 

 

    5.3 说明
    我们选择的是更新操作,文件类型选择XML格式,更新语句可以填写删除语句,如果删除某个索引,可以填写如下代码:
    方法一 

 

<delete><id>1</id></delete>
<commit/>

    方法二

<delete><query>id:1</query></delete>
<commit/>

    如果要清空所有索引,可以填写如下代码:

 

<delete><query>*:*</query></delete>
<commit/>

 

 

    六 总结

 

    增量索引提供了小批量数据更新的可能,在实际需要中,我们可以将全量索引和增量索引结合使用,达到短时间的数据同步和性能消耗的平衡。

 

声明:如无特殊声明,本系列博客以solr-4.7.2版本为例,如有错误,敬请斧正。


http://chatgpt.dhexx.cn/article/dS0HIkGh.shtml

相关文章

解决IDEA一直出现更新索引ideal Updating Indices: Indexing paused问题

前言 小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识&#xff0c;有兴趣的小伙伴可以关注一下&#xff01; 也许一个人独行&#xff0c;可以走的很快&#xff0c;但是一群人结伴而行&#xff0c;才能走的更远&#xff01;让我们在成长的道路上互相学习&…

es 根据索引名称和索引字段更新值

1&#xff1a;指定索引名称和操作指令 instodayorder_new_2022/_update_by_query 2&#xff1a;执行代码 { "script": { "lang": "painless", "source": "if (ctx._source.reserveString_3 null) {ctx._source.reser…

es 修改(更新)索引模板

es 修改(更新)索引模板 es索引模板的好处就不用我多说了&#xff0c;我这里遇到的问题是&#xff0c;如何修改es模板&#xff0c;网上检索的关键词大多是新增/删除模板&#xff0c;我记录一下自己的修改模板操作吧&#xff08;我是在kibana的UI界面进行操作的&#xff09; 1.…

SQL 索引的操作 数据查询(1)数据更新

文章目录 索引的建立与删除建立索引修改索引删除索引 数据更新插入数据插入元组插入子查询结果 修改数据删除数据 数据查询单表查询查询经过计算的值选择表中的若干元组 索引的建立与删除 建立索引 在SQL语言中&#xff0c;建立索引使用 CREATE INDEX 语句&#xff0c;其一般…

Elasticsearch7.8.0版本进阶——动态更新索引

目录 一、如何在保留不变性的前提下实现倒排索引的更新二、按段搜索执行流程三、按段搜索的文档查询四、按段搜索的文档删除五、按段搜索的文档更新 一、如何在保留不变性的前提下实现倒排索引的更新 用更多的索引。通过增加新的补充索引来反映最近的修改&#xff0c;而不是直…

ElasticSearch 动态更新索引

Elasticsearch版本:2.x 1. 不变性 倒排索引被写入磁盘后是 不可改变(immutable):永远不会被修改。不变性有如下几个重要的优势: 不需要锁。如果你没有必要更新索引,你就没有必要担心多进程会同时修改数据。一旦索引被读入内核的文件系统缓存中,由于其不会改变,便会留在那…

MySQL:插入,更新与删除、索引

一、学习目标 掌握如何向表中插入数据掌握更新数据的方法熟悉如何删除数据掌握对数据表基本操作的方法和技巧了解什么是索引掌握创建索引的方法和技巧熟悉如何删除索引熟悉掌握索引的常见问题 二、实验内容 创建表books&#xff0c;对数据表进行插入、更新和删除操作&#x…

搜索引擎索引之如何更新索引

本文节选自《这就是搜索引擎&#xff1a;核心技术详解》第三章 动态索引通过在内存中维护临时索引&#xff0c;可以实现对动态文档和实时搜索的支持。但是服务器内存总是有限的&#xff0c;随着新加入系统的文档越来越多&#xff0c;临时索引消耗的内存也会随之增加。当最初分…

IDEA总是自动更新索引怎么解决

从File进入settings 搜索index_>修改右边的两个即可,点击OK保存即可

项目中如何使用ElasticSearch?变更数据时难道既更新数据库也要更新索引?这篇文章也许对你有点帮助(持续更新)

目录 1. 概述2.ElasticSearch的调试2.1 启动ES2.2 创建搜索的微服务2.3 使用logstash同步数据库数据到es的索引中 3.Linux系统下部署3.1 拉取es容器3.2 让9300端口可用3.3 安装ik分词器3.4 安装head-master3.5 配置logstash&#xff08;耗时最久&#xff09; 四. 出现的bug4.1 …

【Mysql】 sql语句实现update_or_create(唯一索引 ON DUPLICATE KEY UPDATE)

【Mysql】 on duplicate key update用法、优缺点以及使用案例 1. 应用场景&#xff1a; 导入数据功能&#xff0c;需要实现数据不存在时进行新建&#xff0c;有数据修改时则进行更新。在实现时&#xff0c;思路通常为先判断数据是新增还是更新&#xff0c;除了我们在代码层面实…

mysql-索引

1.索引的定义&#xff1a; 索引是帮助MySql高效获取数据的数据结构。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用数据&#xff0c;这样就可以在这些数据结构上实现高级查找算法&#xff0c;这种数据结构就是索…

mysql中的各种索引大总结

文章目录 为啥不用二叉搜索树&#xff1f;为啥不用平衡二叉&#xff08;avl&#xff09;树&#xff1f;为啥不用b-树&#xff1f;为啥用b树&#xff1f;&#xff08;重点&#xff09;索引聚簇索引聚簇索引的局限聚集的数据的优点非聚簇索引介绍组合索引覆盖索引前缀索引前缀索引…

MySQL索引的更新策略

对于数据的每一次更新&#xff0c;MySQL并不会每次都会更新索引(针对非唯一性索引而言)&#xff0c;索引的更新策略是这样的&#xff1a; 在InnoDB中&#xff0c;增删改都会立刻修改主键or唯一索引&#xff0c;但是不会rebuild全局索引&#xff0c;而是对这些索引增加值(或移除…

苹果各机型尺寸大小

//6.5英寸 #define iPhoneXSMax ([UIScreen instancesRespondToSelector:selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1242, 2688), [[UIScreen mainScreen] currentMode].size) : NO) //6.1英寸 #define iPhoneXR ([UIScreen instancesRespondToSelector:selec…

iOS 手机尺寸

iPhone设备 物理分辨率是硬件所支持的&#xff0c;逻辑分辨率是软件可以达到的。 代数设备操作系统逻辑分辨率(point)物理分辨率(pixel)屏幕尺寸(对角线长度)缩放因子 iPhone 第一代iPhone 2GiOS 1320 x 480480 x 3203.5寸1x第二代iPhone 3iOS 2320 x 480480 x 3203.5寸1…

jQuery weui 时间选择器datetimepicker年月日最简单解决方案

使用jqweui的时候发现&#xff0c;datetimePicker&#xff08;时间日期选择器&#xff09;竟然不提供只有年月日这种模式&#xff0c;真是牛逼&#xff08;垃圾&#xff09;&#xff0c;跟着我&#xff0c;只需要很简单的修改就好了&#xff0c;上图 下面是js $("#datati…

jquery weui 显示loading

jQuery weui 显示loading按钮官方文档并没有给出demo&#xff0c;经过调试&#xff0c;把代码给拷贝了出来。 实现显示loading的代码如下&#xff1a; <div id"loadDiv" style"display: none;" class"weui-toast weui_loading_toast weui-toast--…

$ppclass php,jquery weui

"weui-tab"!----"weui-"!--二级页积分详情--"""weui--itemweui-tab__bd-item--active"divclass"details"divclass"page-header"?Html::img($this-theme-getAssetUrl(images/logo.png),[classlogo])?/divahref&q…

移动端框架之JQuery WeUI

和JQuery WeUI 配合使用的WeUI&#xff0c;是移动端快速开发的利器。 在初步使用的过程中&#xff0c;发现JQuery WeUI扩展的几个功能特别实用&#xff1a; 1.通知&#xff1a;模仿iOS风格的通知。你可以自定义标题&#xff0c;文案和图标。通过滑动手势可以关闭。 这种通知形…