知识点
相关文章
更多最近更新
更多Solr4:配置Data Import,从数据库直接创建索引
2019-03-27 01:05|来源: 网路
1. 要求
将数据库中的数据直接创建到Solr索引中去。先做全部索引,然后定期做增量索引。
2. 环境
Solr4.4版本,Tomcat7.0版本,Oracle 11g,已经配置好Tomcat与Solr的集成,包括中文分词等。
3. 实现步骤
3.1 编辑solrconfig.xml文件,在合适位置增加如下代码:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler>
3.2 在conf目录下创建data-config.xml文件,内容如下:
<dataConfig> <dataSource driver="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:orcl" user="mybbs" password="bbs001"/> <document> <entity name="bbsdetail" query="select DETAIL_ID,TITLE,CATEGORY_NAME,PUBLISH_TIME from VIEW_DETAIL"> </entity> </document> </dataConfig>
注意:上面查询语句中定义的字段必须在schema.xml文件中有相关定义。在我这里,VIEW_DETAIL是一张视图,包含了三张表中所有需要索引的列。
上面是Oracle数据库相关代码,如果是SQL Server2012版本,代码如下:
<dataSource driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://localhost:1434;databaseName=rujia;user=sa;password=yourpass;"/>
3.3 拷贝数据库JDBC驱动包及Solr相关的包到$solr-home/lib目录,在我这里是C:/Solr/lib。
文件包括:ojdbc6.jar(如果是SQL Server2012,则是:sqljdbc4.jar)、solr-dataimporthandler-4.4.0.jar、solr-dataimporthandler-extras-4.4.0.jar,后两个包在solr-4.4.0.zip包的dist目录下。
3.4 重新启动Tomcat,登录Solr管理后台,即可以在collection1下面的Dataimport中实现操作。
说明:
- 在做delta-import(增量索引)的时候,应该把clean核选框中勾去掉,以避免清除之前创建的索引。
- 可以选中Auto-Refresh Status核选框,以实时监控当前数据导入状态。
- 可以选中Debug核选框,以方便在出现问题时,通过查看Tomcat后台及Solr控制台界面找出错误原因。
4. 若干问题
问题1:数据库中字段名与schema.xml文件中的字段名不一致时,作如下修改:
<dataConfig> <dataSource driver="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@127.0.0.1:1521:orcl" user="mybbs" password="bbs001"/> <document> <entity name="bbsdetail" query="select DETAIL_ID,TITLE,CATEGORY_NAME,PUBLISH_TIME from VIEW_DETAIL"> <field column="TITLE" name="solr_title"/> <field column="CATEGORY_NAME" name="solr_category_name"/> </entity> </document> </dataConfig>
问题2:数据库有Clob字段需要抓取时,作如下修改:
<dataConfig> <dataSource driver="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:orcl" user="mybbs" password="bbs001"/> <document> <entity name="bbsdetail" transformer="ClobTransformer" query="select DETAIL_ID,TITLE,CATEGORY_NAME,DETAIL_INFO,PUBLISH_TIME from VIEW_DETAIL"> <field column="DETAIL_INFO"clob="true"/> </entity> </document> </dataConfig>
说明:在entity上面增加transformer="ClobTransformer",然后在Clob列上增加“clob="true"即可。
问题3:需要做增量索引时,作如下修改:
<dataConfig> <dataSource driver="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:orcl" user="mybbs" password="bbs001"/> <document> <entity name="bbsdetail" pk="DETAIL_ID" transformer="ClobTransformer" query="select * from VIEW_DETAIL" deltaImportQuery="select * from VIEW_DETAIL where DETAIL_ID='${dih.delta.DETAIL_ID}'" deltaQuery="select DETAIL_ID from VIEW_DETAIL where PUBLISH_TIME > to_date('${dih.last_index_time}','yyyy-mm-dd hh:mi:ss')"> <field column="DETAIL_INFO"clob="true"/> </entity> </document> </dataConfig>
说明:
- pk参数表示主键字段名。
- deltaQuery参数为查询出所有更新时间大于最后创建索引时间的主键值。${dih.last_index_time}是一个内置变量,此值默认存储于conf/dataimport.properties文件中。
- deltaImportQuery参数是按照主键值查询数据的语句。
- pk值,deltaQuery查询字段值,deltaImportQuery查询参数这三个名称必须保持一致(如本例中都为DETAIL_ID)。
问题4:需要查询从表时,作如下修改:
<dataConfig> <dataSource driver="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:orcl" user="mybbs" password="bbs001"/> <document> <entity name="bbsdetail" pk="DETAIL_ID" transformer="ClobTransformer" query="select * from VIEW_DETAIL where district_id=3004" deltaImportQuery="select * from VIEW_DETAIL where DETAIL_ID='${dih.delta.DETAIL_ID}'" deltaQuery="select DETAIL_ID from VIEW_DETAIL where PUBLISH_TIME > to_date('${dih.last_index_time}','yyyy-mm-dd hh:mi:ss')"> <field column="DETAIL_INFO" clob="true"/> <entity name="bbscomment" query="select COMMENT_BODY||'('||to_char(COMMENT_TIME,'yyyy-mm-dd hh:mi:ss')||')' as CONCAT_RESULT from BBSCOMMENT where detail_id=${bbsdetail.DETAIL_ID}"> <field column="CONCAT_RESULT" name="COMMENT_INFO"/> </entity> </entity> </document> </dataConfig>
5. 补充说明
- BBSDETAIL是主表,BBSCOMMENT是从表,为1..n的关系。
- 上述子查询是将从表中的记录形成一条摘要(用操作符”||“将多列合并为一列),保存到索引中。
- schema.xml文件中必须将comment_info字段的multiValued属性设置为true。
转自:http://www.cnblogs.com/nayitian/p/3232427
相关问答
更多-
有solr为什么还要使用数据库[2022-07-17]
solr不安全,没事务 ,没有表关系 -
schema.xml里配过 uniquekey 表示唯一值 默认是id 如果id相同那么执行更新操作而不是添加了
-
solr4 - 索引中的错误节点(solr4 - Error Nodes in Index)[2022-02-10]
如果您之前没有尝试过,可以按照故障排除SolR4索引进行操作 ,这可能有助于您解决问题。 此外,您可以始终尝试执行完整的SolR 4索引重建,如SolR 4索引中所述, 重建并监视有关SolR的应用程序服务器日志。 还要仔细了解如何配置搜索属性并记住它 属性的数据字典设置确定如何索引单个属性 If you didn't try before, you can follow the Troubleshooting SolR4 index which may help you to overcome your ... -
DIH没有任何问题。 确保您的数据库连接字符串有效,并且您的数据库已启动并正在运行。 As Eric Wang pointed out I was using wrong port number and after that also I was getting SSL certificate error the final url string that worked for me is: url="jdbc:mysql://127.0.0.1:3306/indcat?useSSL=false&"
-
文档是一个很好的资源。 您可以在Alfresco服务器上运行安装程序,然后在Solr服务器上再次运行它。 在Alfresco服务器上,删除solr4 WAR。 在Solr服务器上,删除除Solr4 WAR之外的所有内容。 在alf_data中,有两个服务器上需要相同的密钥库目录。 您需要在Alfresco框中编辑alfresco-global.properties以指向Solr主机。 而且,您需要编辑Solr框中的alfresco-global.properties以指向solr索引。 在文档和这些提示之间 ...
-
用于xml文件的DIH(数据导入处理程序)在Solr4中不起作用(DIH(Data Import Handler) for xml files is not working in Solr4)[2022-04-19]
我在solrconfig.xml文件中添加了以下代码行确保你的dist文件夹中的apache-solr-dataimporthandler-4.0.jar和apache-solr-dataimporthandler ... -
如何在solr 6.2.1中导入和索引数据库中的数据(Solr的新增功能)(how to import and index data from database in solr 6.2.1(New to solr))[2023-09-06]
从Solr管理面板看一下你的日志,如果有关于索引过程的任何提示,在url / solr /#/ ~logs中如果你在尝试导入文档时看到任何错误,点击日志行就会给出您有关错误的其他信息。 既然你提到了Solr Admin,我想你正在使用数据导入处理程序。 这是一个非常(非常!)的基本配置,假设你是从mysql索引:选择DataImportHandler。 下载postgresql的jdbc驱动程序并将其放在dist / dir中 将模块添加到配置文件:按照Solr wiki的说明进行操作 请记住在scheme.xml中声明您的方案 在30分钟内完成。 Opte ... Faceting是将搜索结果排列成类别(基于索引术语)。 在每个类别中, Solr报告相关术语的命中数,称为方面约束。 通过分面,用户可以轻松浏览电影网站和产品评论网站等网站上的搜索结果,其中类别中有许多类别和许多项目。 这是一个很好的例子...... Yonik面对的例子 solr wiki上的分面示例 在您的情况下,您可能需要再次触发查询以获取id和其他详细信息.... Faceting is the arrangement of search results into categories (whic ...您可以在raw文件夹中存储一些带有数据库查询的文件,然后只需读取它并将所有内容插入到数据库中,例如: @Override public void onCreate(SQLiteDatabase db) { InputStream inputStream = null; try { inputStream = context.getResources().openRawResource(R.raw.db_initial_import); final String ...