Solr数据库连接之多表关联

Solr环境配置好后,有很多时候我们需要把数据库里的数据添加到索引里,这时就需要配置跟数据库的连接,下面我们看配置的步骤。

1. 配置 solrconfig.xml  (在slor 主目录 core conf下面 我的地址 :D:\SolrHome\collection1\conf\solrconfig.xml )

在根目录下加入如下配置,其中 data-config.xml 是我们要配置的数据库连接文件路径。

 <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
          <str name="config">D:\SolrHome\Question-Hight\conf\data-config.xml</str>
    </lst>
</requestHandler>

2. 创建 data-config.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
    <dataSource driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://127.0.0.1;DatabaseName=QuestionBank" user="sa" password="sa"/>
    <document name="Question-High">
        <entity name="Question"  transformer="HTMLStripTransformer" pk="id"
                 query="select * from [dbo].site_HighSchoolQuestion  where IsEnabled=1"
                 deletedPkQuery="SELECT id FROM [dbo].site_HighSchoolQuestion where IsEnabled=0"
                 deltaImportQuery="select * from [dbo].site_HighSchoolQuestion where id=‘${dih.delta.id}‘"
                 deltaQuery="SELECT id FROM [dbo].site_HighSchoolQuestion where ModifyTime > ‘${dataimporter.last_index_time}‘">
                    <field column="Id"      name="Id"      />
                    <field column="Title"      name="Title"      />
                    <field column="TitleText"      name="TitleText" />
                    <field column="Content"      name="Content" stripHTML="false"/>                     <field column="SubjectInfo"      name="SubjectInfo" stripHTML="false"/>
                    <entity name="Subject" pk="id" query="SELECT [Code] as SubjectCode FROM [dbo].[site_Subject] where  Id =‘${Question.SubjectInfo}‘"
                            deltaQuery="SELECT id FROM [dbo].site_Subject where ModifyTime > ‘${dataimporter.last_index_time}‘"
                            parentDeltaQuery="SELECT id FROM [dbo].site_HighSchoolQuestion where SubjectInfo =‘$(Subject.id)‘">
                         <field column="SubjectCode" name="SubjectCode" />
                    </entity>
         </entity>
    </document>
</dataConfig>

dataSource 节点 配置数据库 连接字符串http://i.cnblogs.com/EditPosts.aspx?opt=1

entity 节点即Solr中对应的实体 其中属性

transformer:转换器

pk :使用的主键

query : 是获取全部数据的SQL  相当于在solr dataimport 页面执行 full-imoport操作时调用的语句 我这里只需要 启用的数据所以加了条件 where IsEnabled=1

deltaImportQuery: 获取增量数据时使用的SQL 语句 指定要获取哪些列 注意后面的条件  where id=‘${dih.delta.id}‘ 这里的 ${dih.delta.id} 是内置变量 它的值跟下面的属性关系密切 它是 deltaQuery 里符合条件的ID

deltaQuery :增量更新时获取PK的SQL语句,${dataimporter.last_index_time}  的值是solr 最后创建索引时间,增量更新是根据这个时间跟数据库更新时间进行对比,选择数据库更新时间在solr更新时间之后的进行更新。

deletedPkQuery : 在某些情况下,可能删除数据并不是物理删除,而只是改变数据库某个值,做个标记,在数据库做了删除标记后,记录还是存在的。这时我们是不需要这些数据进入索引的,

那么我们可以通过这个语句对做过删除标记的索引删除(增量更新时起作用)。

         注意:这个要小心性能问题,它会针对每个 deltaQuery 查询语句里的 id 循环判断 是否在已删除列表里,所以,如果已删除的列表有 200 个

已更新的 ID列表有 10000 个,那么 要进行 200 * 10000 次循环。

field 节点是对应的数据库中的列  其中 column 属性 查询语句中对应的列名, name 属性 solr实体首页的列名。

如果有表关联就出现了下面的配置

<entity name="Subject"  pk="id" query="SELECT [Code] as SubjectCode FROM [dbo].[site_Subject] where  Id =‘${Question.SubjectInfo}‘"
                            deltaQuery="SELECT id FROM [dbo].site_Subject where ModifyTime > ‘${dataimporter.last_index_time}‘"
                            parentDeltaQuery="SELECT id FROM [dbo].site_HighSchoolQuestion where SubjectInfo =‘$(Subject.id)‘">
                         <field column="SubjectCode" name="SubjectCode" />
                    </entity>

这里 subject 是 site_HighSchoolQuestion 表的关联表,我这里要用到它的 SubjectCode 列,所以在它里面配置了 SubjectCode的 field 节点。

entity 节点 name 节点同上,给这个实体取个名字,方便下面引用。

query : 查询语句这里的条件是 id = Question 的 SubjectInfo的值。

deltaQuery: 增量更新时获取PK的SQL语句 同上

parentDEltaQuery: 获取父实体对象PK的语句 如果 Subject 更新了会通知  Question 更新,而更新就是通过PK值进行的,注意我这里的条件 where SubjectInfo =‘$(Subject.id)‘ 因为我这里两张表是通过 SubjectInfo 关联的

这里有2点要注意的:

1. 子entiyt 必须要设置 PK 不然的话是没法更新的

2. 性能问题, 这里如果 deltaQuery 语句查出的是 10000 条记录   parentDeltaQuery 语句就要执行 10000次 。

3. 如果还不能更新请检查你的 SQL 语句

下面就要配置  同目录下的 schema.xml 了。这里是简化的

<?xml version="1.0" encoding="UTF-8" ?>
<schema name="question-heigh" version="1.5">
   <!-- If you remove this field, you must _also_ disable the update log in solrconfig.xml
      or Solr won‘t start. _version_ and update log are required for SolrCloud
   -->
   <field name="_version_" type="long" indexed="true" stored="true"/>

   <!-- points to the root document of a block of nested documents. Required for nested
      document support, may be removed otherwise
   -->
   <field name="_root_" type="string" indexed="true" stored="false"/>

    <!-- 分词器配置 -->
    <fieldType name="text_ik" class="solr.TextField">
        <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
        <analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
    </fieldType>
    <!--  HTML标签过滤  -->
    <charFilter class="solr.HTMLStripCharFilterFactory"/>

    <!-- 数据库字段 -->
   <field name="Id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
   <!-- 启用分词 -->
   <field name="Title" type="text_ik" indexed="true" stored="true" />
   <field name="TitleText" type="string" indexed="true" stored="false" />
   <field name="Content" type="text_ik" indexed="true" stored="true" />
   <!-- 这里subjectInfo 如果是1对多的关系 multiValued 的值要设置为 true,我这里是 1对1 -->
   <field name="SubjectInfo" type="string" indexed="true" stored="true" />
   <field name="SubjectCode" type="string" indexed="true" stored="true" multiValued="false"/>
   <!-- 注意主键设置 -->
   <uniqueKey>Id</uniqueKey>
   <fieldType name="string" class="solr.StrField" sortMissingLast="true" />
   <!-- 随机排序用的 -->
   <fieldType name="random" class="solr.RandomSortField" indexed="true" />
   <!-- 默认查询域 -->
    <defaultSearchField>Title</defaultSearchField>
    <solrQueryParser defaultOperator="AND"/>
</schema>

配置就做好了,别忘了添加连接数据库的 jar 包,下载后复制到部署目录下

以我自己的为例: D:\apachetomcat\apache-tomcat-7.0.59\webapps\solr\WEB-INF\lib

同时还需要 solr安装目录里面 D:\solr-4.10.4\dist 下 solr-dataimporthandler-4.10.4.jar 、solr-dataimporthandler-extras-4.10.4.jar 这两个jar包一起拷过去。

试试,是不是可以跑索引了。

时间: 2024-10-13 16:13:36

Solr数据库连接之多表关联的相关文章

yii2 ActiveRecord多表关联以及多表关联搜索的实现

一个老生常谈的问题.最近通过群里的反馈,觉得很多人还是没有去理解这个问题.今天把这个问题讲明白了,看看yii2 ActiveRecord是怎么个多表关联以及如何去优化这个关联. 场景需求: 假设我们有一张用户表user和一张用户渠道表auth,两张数据表通过user.id和auth.uid进行一对一关联.现需要在user列表展示auth表的来源渠道source,且该渠道可搜索. 首先我们先通过gii生成user和auth系列相关的model和操作.此处不做详细说明,有关gii的操作可参考gii详

Oracle Update 语句语法与性能分析 - 多表关联

Oracle Update 语句语法与性能分析 - 多表关联 为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, SQL 代码 --客户资料表 create table customers ( customer_id number(8) not null, -- 客户标示 city_name varchar2(10) not null, -- 所在城市 customer_type char(2) not null, -- 客户类型 ... ) create

Yii2中多表关联查询(with、join、joinwith)

表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order         (id  order_name   customer_id   book_id) 图书表Book          (id  book_name    author_id) 作者表Author        (id  author_name) 模型定义 下面是这4个个模型的定义,只写出其中的关联 Customer class Customer ex

Hibernate-多表关联查询结果的处理方法

Hibernate多表查询结果处理 (2014-07-06 20:45:40) 转载▼ 标签: hibernate 多表查询 结果集处理 分类: Java 如果我们在Hibernate中需要查询多个表的不同字段,那么如何来获取Hibernate多表查询的结果呢?有两种方式: 1. 对各个字段分别转化成对应类型,如下: Java代码: Query q = session.createQuery(" select members, classInfo.className " + "

Sql语句批量更新数据(多表关联)

最近在项目中遇到一个问题,原来设计的功能是不需要一个特定的字段值depid的,但是新的功能需要根据depid来展现,于是出现了这样一个问题,新增加的数据都有正确的depid,而原来的大量的数据就没有depid或者说depid不是想要的,面临要批量更新原来数据depid的问题. 更新涉及到三个表base_cooperativeGroup,base_groupuser,base_user. 列出表结构: 1.base_cooperativeGroup 2.base_groupuser 3.base_

RDIFramework.NET 中多表关联查询分页实例

RDIFramework.NET 中多表关联查询分页实例 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部署方案.该框架以SOA范式作为指导思想,作为异质系统整合与互操作性.分布式应用提供了可行的解决方案. 分页非常的常见,基本任何项目都会涉及到分页,这没什么好谈的,大多数我们分页对单表的分页比较多,对多表的分页我们可以通过视图来实现,当然还有其他的方式,在这儿,我以一个实例展示下使用我们的RDIFramework.NET来实现多表

ORACLE多表关联UPDATE 语句

1) 最简单的形式 SQL 代码 --经确认customers表中所有customer_id小于1000均为'北京' --1000以内的均是公司走向全国之前的本城市的老客户:) update customers set city_name='北京' where customer_id<1000 2) 两表(多表)关联update -- 仅在where字句中的连接 SQL 代码 --这次提取的数据都是VIP,且包括新增的,所以顺便更新客户类别 update customers a -- 使用别名

MySQL多表关联查询与存储过程

1.多表关联查询 --  **************关联查询(多表查询)**************** -- 需求:查询员工及其所在部门(显示员工姓名,部门名称) -- 1.1 交叉连接查询(不推荐.产生笛卡尔乘积现象:4 * 4=16,有些是重复记录) SELECT empName,deptName FROM employee,dept; -- 需求:查询员工及其所在部门(显示员工姓名,部门名称) -- 多表查询规则:1)确定查询哪些表   2)确定查询哪些字段   3)表与表之间连接条件

oracle多表关联更新

oracle的更新语句不通MSSQL那么简单易写,就算写出来了,但执行时可能会报 这是由于set哪里的子查询查出了多行数据值,oracle规定一对一更新数据,所以提示出错.要解决这样必须保证查出来的值一一对应. 原理 Update语句的原理是先根据where条件查到数据后,如果set中有子查询,则执行子查询把值查出来赋给更新的字段,执行更新. update dept a    set a.loc = (select b.loc from test_dept b where a.deptno =