solr笔记 solr链接数据库(二)
Solr连接数据库
1.根据你的数据库下载不同的数据库数据库驱动(solr会调用数据库驱动来与数据库建立连接) 将其复制到Tomcat根目录下的webapps\solr\WEB-INF\lib下面
2.在Tomcat 根目录\solr\collection1\conf下新建data-config.xml文件(名字任意,路径也可以任意,告诉solr到相关数据库导入相关数据的文件)
3.Tomcat根目录\solr\collection1\conf \solrconfig.xml,文件里配置data-confing.xml路径
这一步则是告诉solr在哪儿找数据库配置的文件 config节点的值是你新建的data-config所在目录
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">C:\Program Files\Apache Software Foundation\Tomcat 7.0\solr\collection1\conf\data-config.xml</str>
</lst></requestHandler>
4.将solr4.72文件夹下的dist, contrib文件夹复制到Tomcat根目录 这里面保留着solr导入数据同步数据所需要的jar solr提前封装好的
5.在Tomcat根目录\solr\collection1\conf \solrconfig.xml,文件里配置dist, contrib这两个文件夹的路径(solrconfig.xml已存在这几个节点。则修改一下就行了)
写你tomcat所在目录哦 我这里只是假设在c盘
这一步配置 告诉solr他需要的相关jar包到哪里去找 (jar包 类似c#封装好的类库而已)
<lib dir="C:/Program Files/Apache Software Foundation/Tomcat 7.0/contrib/extraction/lib" regex=".*\.jar"/> <lib dir="C:/Program Files/Apache Software Foundation/Tomcat 7.0/dist/" regex="solr-cell-\d.*\.jar"/> <lib dir="C:/Program Files/Apache Software Foundation/Tomcat 7.0/contrib/clustering/lib/" regex=".*\.jar"/> <lib dir="C:/Program Files/Apache Software Foundation/Tomcat 7.0/dist/" regex="solr-clustering-\d.*\.jar"/> <lib dir="C:/Program Files/Apache Software Foundation/Tomcat 7.0/contrib/langid/lib/" regex=".*\.jar"/> <lib dir="C:/Program Files/Apache Software Foundation/Tomcat 7.0/dist/" regex="solr-langid-\d.*\.jar"/> <lib dir="C:/Program Files/Apache Software Foundation/Tomcat 7.0/contrib/velocity/lib" regex=".*\.jar"/> <lib dir="C:/Program Files/Apache Software Foundation/Tomcat 7.0/dist/" regex="solr-velocity-\d.*\.jar"/> <lib dir="C:/Program Files/Apache Software Foundation/Tomcat 7.0/dist/" regex="solr-dataimporthandler-\d.*\.jar"/>

<dataConfig> <dataSource type="JdbcDataSource" driver="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@//127.0.0.1:1521/b2c" user="ff" password="ff" /> <document> <entity name="test" pk="ID" query="select p.productid as ID,p.name as productName,p.retailprice as ProductPrice,p.details,tab.tagTitle,tab.tagId,p.isdelete,p.createtime,p.Issell,cm.title as categoryMenuName,cm.recordid as cmRecordid,p.ImagePath,p.CostPrice,p.WholesalePrice,p.MarketPrice,p.Recordid from product p left join( select p.recordid,strcatSpace(t.title) tagTitle,strcatSpace(t.recordid) tagId from product p left join OBJECTTAG o on p.recordid=o.objectrowid left join tagattribute t on o.tagattributerowid=t.recordid group by p.recordid )tab on p.recordid=tab.recordid left join CategoryMenu cm on p.categoryid=cm.recordid where p.isdelete='0'" transformer="ClobTransformer" deltaImportQuery="select p.productid as ID,p.name as productName,p.retailprice as ProductPrice,p.details,tab.tagTitle,tab.tagId,p.isdelete,p.createtime,p.Issell,cm.title as categoryMenuName,cm.recordid as cmRecordid,p.ImagePath,p.CostPrice,p.WholesalePrice,p.MarketPrice,p.Recordid from product p left join( select p.recordid,strcatSpace(t.title) tagTitle,strcatSpace(t.recordid) tagId from product p left join OBJECTTAG o on p.recordid=o.objectrowid left join tagattribute t on o.tagattributerowid=t.recordid group by p.recordid )tab on p.recordid=tab.recordid left join CategoryMenu cm on p.categoryid=cm.recordid where p.productid='${dataimporter.delta.ID}'" deltaQuery="select productid as ID from product where lastupdatetime>to_date('${dataimporter.last_index_time}','YYYY-MM-DD HH24:MI:SS')" deletedPkQuery="select productid as ID from product where isdelete=1" > <field column="ID" name="id"/> <field column="Recordid" name="Recordid"/> <field column="productName" name="ProductName"/> <field column="DETAILS" name="details" clob="true" /> <field column="ProductPrice" name="productprice"/> <field column="CostPrice" name="CostPrice"/> <field column="WholesalePrice" name="WholesalePrice"/> <field column="MarketPrice" name="MarketPrice"/> <field column="tagTitle" name="tagTitle"/> <field column="tagId" name="tagId"/> <field column="Issell" name="Issell"/> <field column="isdelete" name="isdelete"/> <field column="createtime" name="createtime"/> <field column="categoryMenuName" name="categoryMenuName"/> <field column="cmRecordid" name="cmRecordid"/> <field column="ImagePath" name="ImagePath"/> </entity> </document> </dataConfig>
现在开始解释一下各个节点的意思(我的配置文件是根据oracle)
dataSource 节点用于配置数据库相关信息
driver属性 驱动类 不同的数据库驱动配置不一样 具体百度一下 就可以啦。。
url属性 则是数据库连接字符串 同理不痛数据库的都不一样
user属性 数据库用户名
passowrd属性 数据库密码
entity表示一张表
name 属性 逻辑名字 用于你区分这个表的名字
pk 主键名字 必须大写哦 涉及到id的都跟我一样配置就行了
query属性 第一次导入所查询的sql
transformer 这个配置是为了解决oralce导入clob字段不成功的问题
(下面的则是增量配置)
deltaQuery 查询数据库距离上一次同步数据库之后修改的所有数据id
deletedPkQuery 查询删除的数据的字段id
deltaImportQuery 根据上面2项查询的id来查询数据库 进行更新数据
filed导入solr的字段 column 属性 数据库字段名字 name 则是映射到solr类型的name
在tomcat增加自定义类型映射字段 tomcat根目录下的 solr\Colection1\conf\schema.xml
在files节点下新增
type为对应的数据类型 需要分词的字段type则为分词器的name前面配置的
text_ik 则为ik分词器
text_ws(solr自带) 空格分词器 按空格分词 类似 splict(' ');
indexed表示是否索引 需要搜索的的字段才设置为true stored 表示是否物理存储 (这边必须name必须跟上面数据导入配置的filed一一对应)
<!-- 自定义类型映射 --> <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <field name="Recordid" type="string" indexed="true" stored="true"/> <field name="ProductName" type="text_ik" indexed="true" stored="true"/> <field name="details" type="text_ik" indexed="true" stored="true"/> <field name="productprice" type="double" indexed="true" stored="true"/> <field name="CostPrice" type="double" indexed="true" stored="true"/> <field name="WholesalePrice" type="double" indexed="true" stored="true"/> <field name="MarketPrice" type="double" indexed="true" stored="true"/> <field name="tagTitle" type="text_ws" indexed="true" stored="true"/> <field name="tagId" type="text_ws" indexed="true" stored="true"/> <field name="Issell" type="string" indexed="true" stored="true"/> <field name="isdelete" type="string" indexed="true" stored="true"/> <field name="createtime" type="date" indexed="true" stored="true"/> <field name="categoryMenuName" type="string" indexed="true" stored="true"/> <field name="cmRecordid" type="string" indexed="true" stored="true"/> <field name="ImagePath" type="string" indexed="true" stored="true"/>
下面讲下我当前的数据结构
一对多关系 可以嵌套entity来解决
我这里用了自己的解决方案
我的表关系为 商品表 商品标签关联表(表示一个商品可以有多个标签) 商品标签表 可以有多个
select p.recordid,strcatSpace(t.title) tagTitle,strcatSpace(t.recordid) tagId from product p left join OBJECTTAG o on p.recordid=o.objectrowid
left join tagattribute t on o.tagattributerowid=t.recordid
group by p.recordid
如果我一个商品打了2个标签 沙发 和 家具 那么查询出来就是商品id tagTitle为:(沙发id 家具id) tagtile则是(沙发 家具) 搜索的时候通过标签id去查沙发也可以查出这条数据信息 查家具也可以查出来
通过title名字一样(用空格的原因是我这2个字段用了空格分词器 每个空格隔开的当一个词)
最终导入的数据就变成了
网站实例http://www.iwo72.com/Product
配置完这些重启tomcat 访问solr 如果日志没有报错 的话执行导入命令
或者可以通过http接口 其实管理页面的execute也是请求这个接口 直接在浏览器中输入 http://192.168.0.9:8080/solr/collection1/dataimport?command=full-import ip则为你配置的ip
执行完后查看日志是否报错 如果没有报错 在通过query查询
表示导入成功
后面将记录通过增量数据同步问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!