solr与.net系列课程(三)solr连接数据库

 

 solr与.net系列课程(三)solr连接数据库

上一章直接讲述的配置文件把大部分人看的很迷惑,大家都想听的是solr到底是怎么用的,好,这一节我们就开始链接数据库,首先讲一下连接之前都要配置哪些文件

1.先下载连接sqlserver的驱动(sqljdbc4.jar)sqljdbc4.jar,),将其复制到C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\solr\WEB-INF\lib (C:\Program Files\Apache Software Foundation\Tomcat 7.0为tomcat安装路径)
    2.在C:\Program Files\Apache Software Foundation\Tomcat 7.0\solr\collection1\conf下新建data-confing.xml文件(名字任意,路径也可以任意)
    3.在C:\Program Files\Apache Software Foundation\Tomcat 7.0\solr\collection1\conf \solrconfig.xml,文件里配置data-confing.xml路径

<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文件夹复制到C:\Program Files\Apache Software Foundation\Tomcat 7.0\
    5.在C:\Program Files\Apache Software Foundation\Tomcat 7.0\solr\collection1\conf \solrconfig.xml,文件里配置dist, contrib这两个文件夹的路径(solrconfig.xml已存在这些路径,如果以你放置的路径不一样,修改一下就可以了)

 <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" />

6.将dist文件夹下的这两个文件复制到与数据库驱动同一个文件夹下

以上配置的路径我是用绝对路径配置的,也可以用相对路径,

以上就是需要配置的内容了,下面我将结合前一节的内容,讲解如何配置连接数据库

首先是配置data-confing.xml文件,data-confing.xml文件就是连接数据库的配置文件(刚才新建的),将如下代码粘贴到该文件中

<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://192.168.0.8;DatabaseName="test" user="sa" password="123"/>
<document name="Info"> <entity name="zpxx" transformer="ClobTransformer" pk="id"
query="select id, name from table"
deltaImportQuery="select id, name from table"
deltaQuery="SELECT id FROM table where adddate > '${dataimporter.last_index_time}'">
<field column=“id" name=“id" />
<field column=“name" name=“name" />
</entity>
</document>
</dataConfig>

我们来分析一下上面的代码

    <dataSource driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://192.168.0.8;DatabaseName="test" user="sa" password="123"/>

这个显而易见,就是连接数据库的字符串了

<document name="Info">
<entity name="zpxx" transformer="ClobTransformer" pk="id"
query="select id, name from table"
deltaImportQuery="select id, name from table"
deltaQuery="SELECT id FROM table where adddate > '${dataimporter.last_index_time}'">
<field column=“id" name=“solrid" />
<field column=“name" name=“name" />
</entity>
</document>

这个就是从哪张表里取数据了的sql语句了

query是获取全部数据的SQL(solr从sql中获取那些数据)
     deltaImportQuery是获取增量数据时使用的SQL(数据库新增数据是,追加到solr的数据)
     deltaQuery是获取pk的SQL(数据库新增数据是,追加到solr的数据时的条件,根据id ,条件是最后一次获取的时间,${dataimporter.last_index_time,最后获取的时间})

 <field column=“id"      name=“id"      />
<field column=“name" name=“solrname" />

这个就是数据库与solr的映射关系了,在上一节schema.xml中定义的field子节点对应,那么根据本届内容field就要这么定义

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="solrname" type=" string " indexed="true" stored="true" omitNorms="true"/>

其他的field就可以删掉了,也可以多定义一些备用,这样table表中id下的数据就存储在了solr中id的位置,name就存储在solrname下了

 <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"/>

这个不要删,这是solr自已自己内部的字段,删掉会报错,这样solr就配置完成.

之前有朋友问到过多数据库多表的问题,很简单,先说多表的问题:

      <entity> …..  </entity> 每一个 entiy就是一张表,有几张表就写几个,这里就要注意一个问题了,单核的solr是把所有的数据存储在在一个文件中,上文中结束的时候说道, schema.xml这个文件可以设置主键(一定要有主键),默认是id, data-confing.xml,文件定义每张表时也指定了主键,没写没人id,多张表示就要注意id的唯一行了,以为我们总是喜欢使用自增id,所以多张张表的id,主键的的重复solr是不会报错了,但是遵循将相同是后一条覆盖前一条,所以多张表时,就要考虑主键唯一的问题了,如果使用guid的形式那就没问题了,(solr从数据库获取数据是按<entity> …..  </entity>的顺序逐个表去取数据了),那如果非要主键重复存储怎么办,也可以,使用多核模式(以后会讲)

多表实例:

<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://192.168.0.8;DatabaseName="test" user="sa" password="123"/>
<document name="Info"> <entity name="zpxx" transformer="ClobTransformer"
query="select id, name from table"
deltaImportQuery="select id, name from table"
deltaQuery="SELECT id FROM table where adddate > '${dataimporter.last_index_time}'">
<field column=“id" name=“id" />
<field column=“name" name=“name" />
</entity> <entity name="zpxx2" transformer="ClobTransformer"
query="select id, name from table2"
deltaImportQuery="select id, name from table2"
deltaQuery="SELECT id FROM table2 where adddate > '${dataimporter.last_index_time}'">
<field column=“id" name=“id" />
<field column=“name" name=“name" />
</entity>
</document>
</dataConfig>

现在再说一说多数据库的问题了,一个配置文件可以配置多个数据源。增加一个dataSource元素就可以增加一个数据源了。name属性可以区分不同的数据源。如果配置了多于一个的数据源,那么要注意将name配置成唯一的。

多数据库实例:

<dataSource type="JdbcDataSource" name="ds-1" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://db1-host/dbname" user="db_username" password="db_password"/>

<dataSource type="JdbcDataSource" name="ds-2" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://db2-host/dbname" user="db_username" password="db_password"/>

 然后这样使用

..

<entity name="one" dataSource="ds-1" ...>

   ..

</entity>

<entity name="two" dataSource="ds-2" ...>

   ..

</entity>

..

如果存在多表链接怎么办,这个也可以解决, <entity> 中可以嵌套<entity>达到链接效果

例:

   <entity name="item" query="select id name from item">                    

            <entity name="feature" query="select description  from feature where item_id='${item.ID}'"/>            

            <entity name="item_category" query="select phone from  item_category where  category _id='${item.ID}'">

            </entity>

        </entity>

这个相当于 select a.id ,a.name ,b. description ,c. phone from item as a left join feature as b on a.id=b. item_id left join item_category as c on a.id=c. category _id
     这个链接也是有限制的:
           子Entity的query必须引用父Entity的pk
           子Entity的parentDeltaQuery必须引用自己的pk
           子Entity的parentDeltaQuery必须返回父Entity的pk
           deltaImportQuery引用的必须是自己的pk

 那说了这么多 我们来简单的配置一个吧,现在有一张表tableA,有如下字段id ,name,address,phone,class,addtime 我想把这张表的数据存储到solr中, 怎配置,首先在schema.xml 的 fields 节点配置索引字段,(name可以随便起,type是类型,上文字提到过solr的类型,这里为了省事就都用string了)

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="solrname" type=" string " indexed="true" stored="true" omitNorms="true"/>
<field name=" address " type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="phone" type=" string " indexed="true" stored="true" omitNorms="true"/>
<field name="class" type=" string " indexed="true" stored="true" omitNorms="true"/>
<field name="addtime" type=" date" indexed="true" stored="true" omitNorms="true"/>

上文中还提到过 copyfeild与DynamicField,这个可用可不用,怎样用上文已经解释了,solr中会自带一些定义,想删就删,不删也没事,然后我们配置data-confing.xml,如下,

<dataSource driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://192.168.0.8;DatabaseName=test" user="sa" password="123"/>
<document name="Info">
<entity name=" test " transformer="ClobTransformer" pk="id" query="select id, name address,phone,class,addtime from tableA"
deltaImportQuery=" select id, name address,phone,class,addtime from tableA"
deltaQuery="SELECT id FROM tableA where adddate > '${dataimporter.last_index_time}'">
<field column="id" name="solrid" />
<field column="name" name="solrname" />
<field column="address " name=“address " />
<field column="phone " name="phone " />
<field column="class " name="class " />
<field column="addtime " name="addtime " />
</entity>
</document>
</dataConfig>

好了,这样就配置完成了,下面该开始执行了,执行有两种方式

先说第一种,浏览器执行方式:

终止跑索引                  http://192.168.0.9:8080/solr/collection1/dataimport?command=abort

开始索引                     http://192.168.0.9:8080/solr/collection1/dataimport?command=full-import

增量索引                     http://192.168.0.9:8080/solr/collection1/dataimport?command=delta-import

直接在浏览器中输入 http://192.168.0.9:8080/solr/core0/dataimport?command=full-import就可以了

我们看看效果

路径是D盘是因为我只在另一台电脑上执行的,那个配置在D盘了

这种方式我们看不到执行过程,执行时间

Solr还提供了图形化的执行方式,如下:

        Full Import工作原理
        执行本Entity的Query,获取所有数据;
        针对每个行数据Row,获取pk,组装子Entity的Query;
        执行子Entity的Query,获取子Entity的数据。

        Delta Import工作原理
        查找子Entity,直到没有为止;
        执行Entity的deltaQuery,获取变化数据的pk;
        合并子Entity parentDeltaQuery得到的pk;
        针对每一个pk Row,组装父Entity的parentDeltaQuery;
        执行parentDeltaQuery,获取父Entity的pk;
        执行deltaImportQuery,获取自身的数据;
        如果没有deltaImportQuery,就组装Query

小结,今天就讲这么多吧,本来还想给大家展示个实例的,但是发现今天写的有点多,大家应该先理解理解,那真实的案例就在下一节讲述吧,我将为大家装备一个300万数据左右的表,让大家看看实际效果,并为大家讲述如何查询,查询参数等等.

今天感觉写的有点乱,写完后面就忘了前面写的什么了,其实这里面还有好多细节没有讲述,如果大家在使用过程中有什么问题,可以直接给我留言,我会及时为大家解答的.

这里先给大家展示一下300完数据查询的效果:

我们模糊查询一下看看 ,body字段里面存储的是文章,都是几千字以的,现在查询body中带有"信号灯"的数据

看效果

这里要说明一下,300万数据耗时一秒(其实不到一秒),可不是600w就耗时2秒,6000w就耗时20秒的使用,就算是6000w条数据,在配置合理的情况下,也就1,2秒的事

 
 
标签: .net solr

solr连接数据库的更多相关文章

  1. solr与.net系列课程(三)solr连接数据库

     solr与.net系列课程(三)solr连接数据库 上一章直接讲述的配置文件把大部分人看的很迷惑,大家都想听的是solr到底是怎么用的,好,这一节我们就开始链接数据库,首先讲一下连接之前都要配置哪些 ...

  2. solr连接数据库配置

    一般要搜索的信息都是被存储在数据库里面的,但是我们不能直接搜数据库,所以只有借助Solr将要搜索的信息在搜索服务器上进行索引,然后在客户端供客户使用. 一.链接数据库 1. SQL配置 拿SQL Se ...

  3. Solr 连接数据库

    实际工程应用中,从数据库导出数据创建索引再常见不过了,现在实验一下从数据库导入数据创建索引. 一.版本说明 Solr版本:4.7.0 数据库:sqlserver2005 二.配置步骤 1.  准备的j ...

  4. solr DIH 知识梳理

    solr DIH 知识梳理 web.xml中listener配置 <listener> <listener-class>org.apache.solr.handler.data ...

  5. solr 6.1 服务端 tomcat 搭建及调用

    一.下载 apache solr6.1.0 最新版本zip,解压缩生成一个solr6.1.0文件夹 二.安装 1.在d:/projects下新建一个solr 2.把solr6.1.0/server/s ...

  6. solr与.net系列课程(四)solr查询参数的讲解与.net如何获取solr数据

    solr与.net系列课程(四)solr查询参数的讲解与.net如何获取solr数据 上一节我们完成了solr连接数据库,细心的朋友会发现一个问题,就是solr其实和语言没有任何关系,配置完成后任何语 ...

  7. 开源搜索引擎Solr的快速搭建及集成到企业门户最佳实施方案--转载

    笔者经过研究查阅solr官方相关资料经过两周的研究实现了毫秒级百万数据的搜索引擎的搭建并引入到企业门户.现将实施心得和步骤分享一下. 1.      jdk1.6 安装jdk1.6到系统默认目录下X: ...

  8. Apache Solr采用Java开发、基于Lucene的全文搜索服务器

    http://docs.spring.io/spring-data/solr/ 首先介绍一下solr: Apache Solr (读音: SOLer) 是一个开源.高性能.采用Java开发.基于Luc ...

  9. lucene solr

    理解 lucene 是一个全文搜索的引擎 solr是全文搜索的web实现 --------------------.  java.lang.UnsupportedClassVersionError:  ...

随机推荐

  1. 跑ssis分组差错:没有关联“”。假设无法找到一个特定的连接元件,Connections 这种错误发生的收集

    跑ssis分组差错:没有关联"".假设无法找到一个特定的连接元件,Connections 这种错误发生的收集. 在网上搜了一下,解决方法: 打开SqlServer Configur ...

  2. Windows下一个MySQL有些错误的解决方法

    1.无论是什么提示.我们有一个直接看错误日志.由于它描述了最具体描述错误日志. 于MySQL安装文件夹中找到 my.ini简介 看日志保存路径 2. 我的错误是[ERROR] Fatal error: ...

  3. Windows Phone APP中禁用截图

    原文:Windows Phone APP中禁用截图 Windows Phone 8 有系统自带的截图功能,快捷键:电源键+Win键,可以随意截图. Windows Phone 更新GDR2后新增了一个 ...

  4. .net卸载程序制作

    原文:.net卸载程序制作 方法一: 在打包项目中添加文件msiexec.exe(一般在c:\windows\system32(系统目录中)找到). 在文件系统视图中选择应用程序文件,在msiexec ...

  5. SSL/TLS协议运行机制的概述(转)

    互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和运行过程,不涉及具体的实现细节.如果想了解这方面的内容,请参阅RFC文档. 一.作用 ...

  6. (大数据工程师学习路径)第一步 Linux 基础入门----正则表达式基础

    介绍 虽然我们这一节的标题是正则表达式,但实际这一节只是介绍grep,sed,awk这三个命令,而正则表达式作为这三个命令的一种使用方式(命令输出中可以包含正则表达式).正则表达式本身的内容很多,要把 ...

  7. SQLserver创建与主外键的看法

    一个.背景 最初研究的相关内容数据库.仅仅是正式.从来没有练过,只能慢慢漂流,现在做的客房时,,非常多的知识需要使用视图,慢的实践. 视图:我理解的就是一张表.它把我们所须要的某个表或某几个表中的部分 ...

  8. openstack 网络简史

    openstack 网络简史 研究openstack有2个月的时间,这段时间从网上获取N多宝贵资料,对我的学习有非常大帮助,在加上我自己的研究,最终对openstack整个网络体系有了个浅显的认识,写 ...

  9. freemarker 空白处理

    1 一个简短的引论 HTML 和 XML 都不是对空白敏感的,可是这么多多余的空白是非常令人头疼的,并且添加处理后的 HTML 文件大小也是不是必需的.当然,对于空白敏感的方式的输出这依然是个大问题. ...

  10. DirectSound应用

    只是使用的假设PlaySound()这个API函数来显示的声音效果,然后,然后,它不会出现在混合声音,因为PlaySound还有播放期间声音,这将不可避免地导致现有声音停止. 因此,使用 PlaySo ...