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包一起拷过去。

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

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

  1. orm 语法 数据库连接、建表、增删改查、回滚、单键关联 、多键关联、三表关联

    1.数据库连接, #!usr/bin/env/python # -*- coding:utf-8 -*- # from wangteng import sqlalchemy from sqlalche ...

  2. spring-data-jpa 介绍 复杂查询,包括多表关联,分页,排序等

    本篇进行Spring-data-jpa的介绍,几乎涵盖该框架的所有方面,在日常的开发当中,基本上能满足所有需求.这里不讲解JPA和Spring-data-jpa单独使用,所有的内容都是在和Spring ...

  3. KETTLE多表关联的同步一张表的两种实现方式

    以下操作都在5.0.1版本下进行开发,其余版本可以进行自动比对 在平时工作当中,会遇到这种情况,而且很常见.比如:读取对方的多个视图或者表,写入目标库的一张表中,就涉及到多表的同步. 多表同步可以有以 ...

  4. Mongoose 两个表关联查询aggregate 以及 Mongoose中获取ObjectId

    Mongoose 两个表关联查询aggregate 通常两个表关联查询的时候,是一种一对多的关系,比如订单与订单详情就是一对多的关系,一个订单下面有多个商品 数据模拟 首先我们先将数据模拟出来,先选择 ...

  5. Mybatis表关联一对多、多对一、多对多

    项目工程结构如下: 1. 搭建MyBatis框架环境 首先需要引入两个包:mybatis.jar 和 sqljdbc42.jar包 若分页需要导入两个包:pagehelper-5.1.0.jar 和 ...

  6. mongodb 多表关联处理 : 内嵌以及连接(手动引用、DBref) 、aggregate中$lookup

    MongoDB与关系型数据库的建模还是有许多不同,因为MongoDB支持内嵌对象和数组类型.MongoDB建模有两种方式,一种是内嵌(Embed),另一种是连接(Link).那么何时Embed何时Li ...

  7. EF里单个实体的增查改删以及主从表关联数据的各种增删 改查

    本文目录 EF对单个实体的增查改删 增加单个实体 查询单个实体 修改单个实体 删除单个实体 EF里主从表关联数据的各种增删改查 增加(增加从表数据.增加主从表数据) 查询(根据主表找从表数据.根据从表 ...

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

    作者:白狼 出处:http://www.manks.top/yii2_many_ar_relation_search.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明 ...

  9. mongodb 3.x 之实用新功能窥看[2] ——使用$lookup做多表关联处理

    这篇我们来看mongodb另一个非常有意思的东西,那就是$lookup,我们知道mongodb是一个文档型的数据库,而且它也是最像关系型数据库的 一种nosql,但是呢,既然mongodb是无模式的, ...

随机推荐

  1. 加了GO后报 'GO' 附近有语法错误

    单独运行SQL无问题,了加GO就报错. 是你的SQL语句中,有些行的结尾处只有Char(13)没有Char(10),即:只有回车符没有换行符,这种状态在视觉上是没办法区分的. 参考:http://ww ...

  2. 【Spring-AOP-1】AOP相关概念

    Advice (好多中文书籍翻译为:增强处理,比如前向增强.后向增强等) 描述了Aspect类执行的具体动作.the job of an aspect. 定义了如下两个方面: what:即Aspect ...

  3. (ORA-12899) 10g数据库导入到11g数据库时报错

    问题: 10g数据库导入到11g数据库时,部分表的字段会出现ORA-12899的报错,如下: IMP-00019: 由于 ORACLE 错误 12899 而拒绝行       IMP-00003: 遇 ...

  4. class 文件与dex文件区别 (dvm与jvm区别)及Android DVM介绍

    区别一:dvm执行的是.dex格式文件  jvm执行的是.class文件   android程序编译完之后生产.class文件,然后,dex工具会把.class文件处理成.dex文件,然后把资源文件和 ...

  5. 黄聪:wordpress前台自定义用户,调用wp_editor上传附件提示【抱歉,出于安全的考虑,不支持此文件类型】错误。

    1.直接禁用文件类型检测,在wp-config.php文件中,添加这样一句代码define('ALLOW_UNFILTERED_UPLOADS', true); 2.在functions.php里面, ...

  6. ARM NEON编程系列1-导论

    ARM NEON 编程系列1 - 导论 前言 本系列博文用于介绍ARM CPU下NEON指令优化. 博文github地址:github 相关代码github地址:github NEON历史 ARM处理 ...

  7. [JS]Javascript的函数总结

    Javascript中不存在函数重载,同名的函数将被最后一个覆盖. function test(a,b){ this.x = 1;} function test(a){ this.x = 2;} fu ...

  8. python3-cookbook

    http://python3-cookbook.readthedocs.io/zh_CN/latest/index.html 一般的类找方法,通过MRO找到第一个就停了对吧,可以描述器好像会顺着MRO ...

  9. python(22)总结下最近遇到的编码问题

    最近爬取,或者解析网页是总是遇到编码问题(我的版本:python2.7) 一.常见异常:UnicodeEncodeError: 'ascii' codec can't encode character ...

  10. python (11)文件的读写 按行读文件

    读文件: 读取文件 f = open('\info.txt') fil = f.read() f.close() 按行读文件: f = open("info.txt") while ...