solr索引导入solr 建立数据库索引的问题

一、设定应用布署环境为Nginx+Tomcat
二、问题集:
1、Nginx下504 Timeout出错或Length出错
2、Nginx下502 Conntect Refused出错及solr使用域名时的安全问题
3、Java Heap Out of Memory出错
三、问题详细分析
1、由于请求时间太长,导致请求时间过期;在Nginx的缓存设置太小,导致Length出错
2、solr使用域名后,需要加上安全控制配置,这时需要确保当前的布署应用的ip是被允许访问solr的,否则会出现502错误。
3、由于一次性取出内容的数据列表对象太大,导致内存溢出。
四、问题的解决
1、nginx配置片短
listen 80;
server_//配置成域名访问
location / {
deny 192.168.1.1;
allow 192.168.90.0/24;你允许的内部外段
proxy_pass http://192.168.90.24:8080;
proxy_//此处解决Length问题
proxy_set_header
index index.
client_max_body_size
#client_body_buffer_size 128k;
//以下解决超时问题
proxy_connect_timeout
proxy_send_timeout
proxy_read_timeout
当然相关的应用调用时,也要做相关的timeout配置
2、tomcat connector配置片段
&Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
maxHttpHeaderSize="8192"
maxThreads="5000" minSpareThreads="1000"
enableLookups="false" redirectPort="8443" acceptCount="3500"
connectionTimeout="600000"
说明3 disableUploadTimeout="true"
compression="on" compressionMinSize="2048"
compressableMimeType="text/html,text/xml,application/x-javascript,text/javascript,text/css,text/plain"
3、为防止内存溢出,需指定jvm以下参数较大值,比如 -Xms1024m -Xmx1024m
说明1:solr支持分布式布署,使用域名调用更加灵活和便于分布式的实现。另外solr提供后台管理,若应用布署在远程机房,如果不使用域名,造成无法访问solr服务。由此还是有必要提供域名,但是这给solr的安全带来隐患,因此需要过虑和限制ip,比如我们这里只允许远程机房内部网段和公司的ip可访问solr域名。这样就达到了solr服务的安全性,又方便于以后分布式扩展及工作环境下访问solr的后台管理。
说明2:由于内容较大,需设置proxy_
说明3:由于solr服务及其他调用solr服务的应用是在一个请求链上,因此相关的请求时间都需要设大。看上面的说明3标志,至少有三个地方需要相关的timeout设置
五、应用优化
以上方法,虽然一时避免问题的出现,但如果数据量再次扩大,可能还是没有根本解决问题。需要从进一步优化应用。优化办法
1、尽可能使用增量重建索引,由于增量索引数据量小,可避免以上所有问题。
2、即使全文索引重建索引无法避免,必须按业务分段增量重建,比如每次取2000条记录,不要形成java大对象,这样也可避免以上所有问题。
六、在解决问题的过程中,一度尝试使用nginx HttpChunkinModule来解决问题,低版本的nginx需要安装 HttpChunkinModule,因此直接升级nginx到1.4.1版本,但此时设置重起nginx无法生效;
最终在/questions/159313/enabling-nginx-chunked-transfer-encoding/573找到了解决问题的关键"proxy_"//此处解决Length问题,也就没有必要进一步去研究HttpChunkinModule。
进一步了解在HttpChunkinModule http://wiki.nginx.org/HttpChunkinModule
truemylife
浏览: 174645 次
来自: 杭州
* failover for trigger re ...
求个最新版的jar包,谢谢!邮箱:tankerxp@sina. ...
&nav id=&page-nav& ...
不是注释 是注解!!!!
哈哈 ,,我就在找这个,,
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'根据前面的步骤,solr已经与tomcat集成成功,并配置了中文分词器。然而数据库中的数据要怎么同步到solr索引库中呢?
一、建立数据库表
CREATE TABLE `image_info` (
`id` varchar(32) NOT NULL,
`src` text,
`update_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
二、配置solrconfig.xml
打开Solr主目录的conf文件夹下(D:\Java\solr\collection1\conf)的配置文件solrconfig.xml,加入一个请求处理者配置:
&span style=&white-space:pre&& &/span&&!-- 导入数据库配置 --&
&requestHandler name=&/dataimport& class=&solr.DataImportHandler&&
    &lst name=&defaults&&
      &str name=&config&&data-config.xml&/str&
    &/lst&
  &/requestHandler&
在后面的数据导入中,请求的就是dataimport这个请求处理器。
三、新建data-config.xml
在同级目录下(D:\Java\solrhome\collection1\conf)新建一个配置文件data-config.xml,加入下面内容:
&dataConfig&
&dataSource type=&JdbcDataSource& driver=&com.mysql.jdbc.Driver& url=&jdbc:mysql://localhost:3306/dbname& user=&root& password=&***& /&
&document&
&entity name=&imageInfo& query=&select id,src,key_info from image_info&&
&field column=&id& name=&id&/&
&field column=&src& name=&src&/&
&field column=&key_info& name=&key_info&/&
&/document&
&/dataConfig&
filed域配置数据库表的列名,到scheme.xml配置文件中配置的的索引字段名称的映射。
entity节点中的name属性需唯一,如果存在多个表需要建立索引库,则通过该属性区分。
四、配置schema.xml
&!--iamge_info表字段--&
&field name=&src& type=&string& indexed=&true& stored=&true&/&
&field name=&key_info& type=&textMaxWord& indexed=&true& stored=&true&/&
因为id字段已经配置了,所以不需要我们加了,它可是必须的,是一个唯一主键。
五、加入jdbc驱动
因为solr需要通过jdbc连接到数据库进行数据同步,所以需在solr工程的lib目录下添加jdbc驱动。
六、加入同步数据的jar包
到solr解压包下的dist目录下solr-dataimporthandler-5.4.1.jar和solr-dataimporthandler-extras-5.4.1.jar这两个jar包,同样放到部署到solr的lib目录下。
启动Tomcat,在浏览器中输入:
http://localhost:8080/solr/dataimport?command=full-import 进行全量导入。
本文已收录于以下专栏:
相关文章推荐
首先说一下是从mysql数据库导入数据
这里使用的是mysql测试。
1、先在mysql中建一个表:solr_test
2、插入几条测试数据:
3、用记事本打solrc...
废话不多说,我电脑配置 i7四核cpu 8G内存
插入数据文档中有5个字段,其中有两个分词,一个int,一个date
批量插入测试一次10万循环10次总共100万用时85秒
批量插入测试一次...
有时候我们会碰到这样的场景:利用Spark批量插入数据。因为Spark相比MR编程更方便,更容易上手。因此接下来讲讲利用Spark批量插入数据时候的注意点。假设批量往SolrCloud里面插入数据。
在上一章中导入数据的方式是全量导入,如果每次导入数据都是全量导入的话,首先是没必要,其次在海量数据下对服务器的压力也较大。所以合理的方式是更新索引采用定时增量更新。
二、修改数据库
在数据库...
当xml文档中有一个或多个namespace时,用xpath获取不到节点。此时 需要手动设置namespace。例如:需要修改pom.xml中的artifactid。
xml如下:&project ...
一、使用背景
几乎在每个项目中都会频繁使用搜索功能,并且数据量很大,如果仍然采用out of date的SQL语句查询数据库的方式,个人觉得不仅会增加服务器的负担,也会觉得这种方式略显土气,跟不上IT...
一、solr自带导入插件DataImporte设置
1、在solrconfig.xml文件中添加如下内容,引入DataImport功能,并设置配置文件位置。
他的最新文章
讲师:汪剑
讲师:刘道宽
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)solr导入数据的两种方法
一、&&& 在导入数据之前需要先配置好schemal.xml文件.
上文copy了dih项目的schemal文件,其中的三个字段是必须有的,分别是id, _version_,text 。否则会报错如下:
&ERROR (searcherExecutor-7-thread-1-processing-x:solr) [&& x:solr] o.a.s.c.S
olrCore org.mon.SolrException: undefined field text
&&&&&&& at org.apache.solr.schema.IndexSchema.getDynamicFieldType(IndexSchema.ja
二、使用data-import工具索引构建
全量与增量索引构建:
在solr-data-config.xml配置:
&dataConfig&
&&& &dataSource driver=&com.mysql.jdbc.Driver& url=&jdbc:mysql://127.0.0.1:3306/cz?useUnicode=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true& user=&*& password=&*& /&
&&& &document name=&products&&
&&&&&&& &entity name=&item& pk=&product_id&
&&&&&&&&&&&&&&& query=&select product_id,name,update_time from product limit 10&
&&&&&&&&&&&&&&& deltaImportQuery=&select product_id,name,update_time from product& where product_id=&${dih.delta.product_id}&&
&&&&&&&&&&&&&&& deltaQuery=&select product_id,name,update_time& from artisan_product where update_time & &${dataimporter.last_index_time}&&&
&&&&&&&&&&& &field column=&product_id& name=&id& /&
&&&&&&&&&&& &field column=&name& name=&name& /&&&&&&&&&&&
&&& &&& &&& &field column=&update_time& name=&update_time& /&&&&&&&&&&&
&&&&&&& &/entity&
&&& &/document&
&/dataConfig&
访问以下接口以更新索引
http://localhost:8080/solr/solr/dataimport?command=full-import
http://localhost:8080/solr/solr/dataimport?command=delta-import
三、使用sorlj创建、更新、删除索引
SolrInputDocument doc = new SolrInputDocument();
doc.addField(字段名, 字段值);
solrServer.add(doc);
上面solrServer的创建
HttpSolrClient solr =
&&& solr = new HttpSolrClient(&http://localhost:8080/solr/solr&);
&&& solr.setConnectionTimeout(100);
&&& solr.setDefaultMaxConnectionsPerHost(100);
&&& solr.setMaxTotalConnections(100);
&&& solrServer =
} catch (Exception e) {
&&& log.error(e.getMessage(),e);
四、使用solr自带的post更新数据工具不可用.
windows下执行
Cd E:\work\solr\test\solr-5.3.1
java -Dc=img& -Durl=http://localhost:8080/solr/solr/update -jar example/exampledocs/post.jar C:\Users\dell\Desktop\img.csv
Unexpected character &&& (code 34) expected &&& at [row,col {unknown-source}]: [1,1]
&不知谓,最后也没用这个。
浏览次数:0次&
<wb:share-button appkey="" addition="simple" type="button" ralateUid="" default_text="%E3%80%90solr%E5%AF%BC%E5%85%A5%E6%95%B0%E6%8D%AE%E7%9A%84%E4%B8%A4%E7%A7%8D%E6%96%B9%E6%B3%95%E3%80%91+%E4%B8%80%E3%80%81%C2%A0%C2%A0%C2%A0+%E5%9C%A8%E5%AF%BC%E5%85%A5%E6%95%B0%E6%8D%AE%E4%B9%8B%E5%89%8D%E9%9C%80%E8%A6%81%E5%85%88%E9%85%8D%E7%BD%AE%E5%A5%BDschemal.xml%E6%96%87%E4%BB%B6.+%0A%E4%B8%8A%E6%96%87copy%E4%BA%86dih%E9%A1%B9%E7%9B%AE%E7%9A%84schemal%E6%96%87%E4%BB%B6%EF%BC%8C%E5%85%B6%E4%B8%AD%E7%9A%84%E4%B8%89%E4%B8%AA%E5%AD%97%E6%AE%B5%E6%98%AF%E5%BF%85%E9%A1%BB%E6%9C%89%E7%9A%84%EF%BC%8C%E5%88%86%E5%88%AB%E6%98%AFid%2C+_versi..." pic="http://www.highersoft.net/一、&&& 在导入数据之前需要先配置好schemal.xml文件.
上文copy了dih项目的schemal文件,其中的三个字段是必须有的,分别是id, _version_,text 。否则会报错如下:解决Solr对Mysql做数据导入时内存溢出的问题
& & 近日在对Mysql数据做索引的时候,由于数据量太大(百万级),所以在索引过程中经常会内存溢出,在网上上找了不少解决的办法都没有效果,BatchSize不起作用,应该是Mysql不支持Batch操作。搞的非常恼火,觉得Solr怎么对这么常见的问题都没有解决办法,实在不行就只能通过手写SQL的方式来分批导入了。& & 抱着最后一点期望向前辈同事请教,结果他门前也是遇到过这样的问题,自己写了一个类,原理就是对SqlEntityProcessor做了改写,然后用Mysql的limit方法做到批量导入的效果,实际试了一下,果然成功执行。看来以后遇到问题还是得多问,自己遇到的问题别人很可能也会遇到过,这样会少走不少弯路。附上实际的代码:package org.apache.solr.handler.import static org.apache.solr.handler.dataimport.DataImportHandlerException.wrapAndTimport java.util.Iimport java.util.Mimport org.apache.solr.handler.dataimport.*;import org.slf4j.Limport org.slf4j.LoggerFimport java.util.regex.Mimport java.util.regex.P/**&* Basically this is a hacked version of SqlEntityProcessor.&* Just for MySQL, and maybe someone can modify it to fit to other DBMS.&*&&* The goal of this hacked version is want to make the batch process of huge number of data possible.&* This processor will auto append &LIMIT& syntax to SQL query until end of data.&* Each SQL query will have &batchSize& rows and then we&ll not OOM anymore.&&*/public class MySqlBatchEntityProcessor extends EntityProcessorBase { private static final Logger LOG = LoggerFactory
.getLogger(MySqlBatchEntityProcessor.class); protected DataSource&Iterator&Map&String, Object&&& dataS private int batchS private int offset = 0; @SuppressWarnings(&unchecked&) public void init(Context context) {
super.init(context);
dataSource = context.getDataSource();
batchSize = Integer.parseInt(context.getEntityAttribute(&batchSize&)); } protected void initQuery(String q) {
DataImporter.QUERY_COUNT.get().incrementAndGet();
rowIterator = dataSource.getData(q + & LIMIT & + offset + &,&
+ batchSize);
this.query =
} catch (DataImportHandlerException e) {
} catch (Exception e) {
LOG.error(&The query failed && + q + &&&, e);
throw new DataImportHandlerException(
DataImportHandlerException.SEVERE, e);
} } public Map&String, Object& nextRow() {
if (rowIterator == null) {
String q = getQuery();
initQuery(context.replaceTokens(q));
return getNext(); } public Map&String, Object& nextModifiedRowKey() {
if (rowIterator == null) {
String deltaQuery = context.getEntityAttribute(DELTA_QUERY);
if (deltaQuery == null)
initQuery(context.replaceTokens(deltaQuery));
return getNext(); } public Map&String, Object& nextDeletedRowKey() {
if (rowIterator == null) {
String deletedPkQuery = context.getEntityAttribute(DEL_PK_QUERY);
if (deletedPkQuery == null)
initQuery(context.replaceTokens(deletedPkQuery));
return getNext(); } public Map&String, Object& nextModifiedParentRowKey() {
if (rowIterator == null) {
String parentDeltaQuery = context
.getEntityAttribute(PARENT_DELTA_QUERY);
if (parentDeltaQuery == null)
</(&Running parentDeltaQuery for Entity: &
+ context.getEntityAttribute(&name&));
initQuery(context.replaceTokens(parentDeltaQuery));
return getNext(); } public String getQuery() {
String queryString = context.getEntityAttribute(QUERY);
if (Context.FULL_DUMP.equals(context.currentProcess())) {
return queryS
if (Context.DELTA_DUMP.equals(context.currentProcess())) {
String deltaImportQuery = context
.getEntityAttribute(DELTA_IMPORT_QUERY);
if (deltaImportQuery != null)
return deltaImportQ
return getDeltaImportQuery(queryString); } public String getDeltaImportQuery(String queryString) {
StringBuilder sb = new StringBuilder(queryString);
if (SELECT_WHERE_PATTERN.matcher(queryString).find()) {
sb.append(& and &);
sb.append(& where &);
boolean first =
String[] primaryKeys = context.getEntityAttribute(&pk&).split(&,&);
for (String primaryKey : primaryKeys) {
if (!first) {
sb.append(& and &);
Object val = context.resolve(&dataimporter.delta.& + primaryKey);
if (val == null) {
Matcher m = DOT_PATTERN.matcher(primaryKey);
if (m.find()) {
val = context.resolve(&dataimporter.delta.& + m.group(1));
sb.append(primaryKey).append(& = &);
if (val instanceof Number) {
sb.append(val.toString());
sb.append(&&&).append(val.toString()).append(&&&);
return sb.toString(); } protected Map&String, Object& getNext() {
if (rowIterator == null)
if (rowIterator.hasNext()) {
return rowIterator.next();
else if (offset &= (batchSize)) {
DataImporter.QUERY_COUNT.get().incrementAndGet();
rowIterator = dataSource.getData(query + & LIMIT & + offset + &,& + batchSize);
if (rowIterator.hasNext()) {
return rowIterator.next();
offset = 0;
rowIterator =
} catch (Exception e) {
LOG.error(&getNext() failed for query && + query + && LIMIT(& + offset + &,& + batchSize + &)&, e);
rowIterator =
wrapAndThrow(DataImportHandlerException.WARN, e);
} } private static Pattern SELECT_WHERE_PATTERN = pile(
&^\\s*(select\\b.*?\\b)(where).*&, Pattern.CASE_INSENSITIVE); public static final String QUERY = &query&; public static final String DELTA_QUERY = &deltaQuery&; public static final String DELTA_IMPORT_QUERY = &deltaImportQuery&; public static final String PARENT_DELTA_QUERY = &parentDeltaQuery&; public static final String DEL_PK_QUERY = &deletedPkQuery&; public static final Pattern DOT_PATTERN = pile(&.*?\\.(.*)$&);}
&&最后修改于
请各位遵纪守法并注意语言文明博客分类:
&& solr从数据库导入数据到索引中
准备工作需要从solr4.2中C:\Users\cuichao\Desktop\solr\solr-4.2.1\dist目录下
把solr-dataimporthandler-4.2.1.jar包拷到D:\tomcat6\apache-tomcat-6.0.36.0\webapps\solr\WEB-INF\lib目录下
第一步,需要在solrconfig.xml中写入
&requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"&
&lst name="defaults"&
&str name="config"&D:\tomcat6\apache-tomcat-6.0.36.0\webapps\solr\collection3\conf\data-config.xml&/str&
&/requestHandler&
第二步,需要在solrconfig.xml同级目录下,拷贝data-config.xml
(1),首先需要定义数据源
(2). 其次需要定义实体类以及语句
&dataConfig&
&dataSource name="mydb" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/solvenew" user="root" password="ninemax"/&
&document&
dataSource="mydb" name="tagged2_needtag" query="select * from tagged2_needtag"&
&field column="id" name="id"/&
&field column="number" name="number"/&
&field column="nnp" name="nnp"/&
&field column="name3" name="name3"/&
&/document&
&/dataConfig&
&&&&&&&&& 第三步,需要在schema.xml中定义如下测试信息
&field name="number" type="string" indexed="true" stored="true" omitNorms="true"/&
&field name="nnp" type="string" indexed="true" stored="true" omitNorms="true"/&
&field name="name3" type="string" indexed="true" stored="true" omitNorms="true"/&
&&&&&&&&& 主键无需定义
& 第四步,访问管理页面,点左下角那个导入工具
& 勾选实体类,勾选commint,及optimze然后点击execute执行即可
qindongliang1922
浏览: 1064926 次
来自: 北京
浏览量:90903
浏览量:87062
浏览量:39591
浏览量:36150
有没有demo了,介绍了这么多 还是不知道怎么用和优势
内容非常不错,就是字体能修改一下就好了
楼主,请教个问题,文中提到的“索引两个字段,一个分词,一个不分 ...
向您请教,采用第二种方式启动Web项目,如何设置log,而不至 ...
非阻塞的举例不恰当
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'}

我要回帖

更多关于 solr导入数据库的问题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信