全文总结:
solr 有几种导入数据的方式
solr数据导入,经过这几天的查资料,我觉得solr数据导入可以有三种方式:
1、编写数据xml文件,通过post.jar导入;
2、通过DIH导入;
3、利用solrj导入数据;
现针对第三种方式进行研究,在第一步中写了一段小的测试代码,可以参考:
具体的代码解释如下:
String url = "";
HttpSolrServer server = new HttpSolrServer(url);
//If you wish to delete all the data from the index, do this
//server.deleteByQuery( "*:*" );
//Construct a document
SolrInputDocument doc1 = new SolrInputDocument();
doc1.addField( "id", "id1_solrj" );
doc1.addField( "type", "doc1_solrj" );
doc1.addField( "name", "name1_solrj" );
//Construct another document
SolrInputDocument doc2 = new SolrInputDocument();
doc2.addField( "id", "id2" );
doc2.addField( "type", "doc2_solrj" );
doc2.addField( "name", "name2_solrj" );
//Create a collection of documents
CollectionSolrInputDocument docs = new ArrayListSolrInputDocument();
docs.add(doc1);
docs.add(doc2);
//Do a commit
try {
server.add(docs);
server.commit();
} catch (SolrServerException e) {
System.out.println("server commit error, error code:");
e.printStackTrace();
} catch (IOException e) {
System.out.println("server commit error, error code:");
e.printStackTrace();
}
}
该端代码执行后报异常:expect mime type application/octet-stream but got text/html
没找到这个的解决办法,根据提示好像是说期望的类型和服务器反馈的类型不匹配
最后的解决办法是这样的:
之前在配置solr服务器的时候将solr解压路径\solr-4.8.1\example\solr下的solr.xml用\solr-4.8.1\example\multicore下的solr.xml文件进行了替换,目的是为了引入core0和core1,现在需要将这个动作进行回滚,并且修改collection1下的conf下的schema.xml文件,修改为对应的需要的列定义。然后执行以上的代码就不会产生问题。
原因我也不太明白,感觉应该是collection1的配置和core1、core0、乃至之前文章提到过的solrtest的配置应该不太一样。原因待查。不过现在已经可以通过客户端的方式将数据导入solr服务器,并在前端可以查询到相应的数据。
java web 怎么用solr
我们下载的Solr包后,进入Solr所在的目录,我们可以看到以下几个目录:build、client、dist、example、lib、site、src。下面分别对其进行介绍。
1) build:该目录是在ant build过程中生成的,其中包含了未被打包成jar或是war的class文件以及一些文档文件。
2) client:该目录包含了特定语言的Solr客户端API,使得使用其他语言的用户能通过HTTP用XML与Solr进行通话。现在该目录里面虽然包含javascript、python、ruby三个子目录,但是到目前为止只包含一部分的ruby的代码,其他语言仍是空的。另外,Solr的Java客户端称为SolrJ,其代码位于src/solrj目录下面。在之后的文章中我会详细介绍Solr客户端的使用。
3) dist:该目录包含build过程中产生的war和jar文件,以及相关的依赖文件。还记得上一篇文章中,我们在build 1.4版本的Solr源代码后需要部署example吗?其实就是将该目录下面的apache-solr-1.4.war部署到Jetty上面去,并重命名为solr.war。
4) example:这个目录实际上是Jetty的安装目录。其中包含了一些样例数据和一些Solr的配置。
其中一些子目录也比较重要,这里也对它们稍作介绍。
l example/etc:该目录包含了Jetty的配置,在这里我们可以将Jetty的默认端口从8983改为80端口。
l 将其中的8983端口换成80端口。注意更改端口后启动Jetty可能会提示你没有权限,你需要使用sudo java -jar start.jar来运行。
l example/multicore:该目录包含了在Solr的multicore中设置的多个home目录。在之后的文章中我会对其进行介绍。
l example/solr:该目录是一个包含了默认配置信息的Solr的home目录。
详见下面的“solr home说明”
l example/webapps:Jetty的webapps目录,该目录通常用来放置Java的Web应用程序。在Solr中,前面提到的solr.war文件就部署在这里。
5) lib:该目录包含了所有Solr的API所依赖的库文件。其中包括Lucene,Apache commons utilities和用来处理XML的Stax库。
6) site:该目录仅仅包含了Solr的官网的网页内容,以及一些教程的PDF文档。
7) src:该目录包含了Solr项目的整个源代码。这里对其各个子目录也做相应的介绍。
l src/java:该目录存放的是Solr使用Java编写的源代码。
l src/scripts:该目录存放的是配置Solr服务器的Unix BashShell脚本,在后面介绍多服务器配置中将会有重要的作用。
l src/solrj:前面提到过该目录存放的是Solr的Java版本的客户端代码。
l src/test:该目录存放的是测试程序的源代码和测试文件。
l src/webapp:该目录存放的是管理Solr的Web页面,包括Servlet和JSP文件,其构成了前面提到的WAR文件。管理Solr的JSP页面在web/admin目录下面,如果你有兴趣折腾Solr可以找到相应的JSP的页面对其进行设置
1.4.2 Solr home说明
所谓的Solr home目录实际上是一个运行的Solr实例所对应的配置和数据(Lucene索引)。在上一篇文章中我提到过在Solr的example/solr目录就是一个Solr用做示例的默认配置home目录。实际上example/multicore也是一个合法的Solr home目录,只不过是用来做mult-core设置的。那么我们来看看example/solr这个目录里面都有些什么。
example/solr目录下主要有以下一些目录和文件:
1) bin:如果你需要对Solr进行更高级的配置,该目录建议用来存放Solr的复制脚本。
2) conf :该目录下面包含了各种配置文件,下面列出了两个最为重要的配置文件。其余的.txt和.xml文件被这两个文件所引用,如用来对文本进行特殊的处理。
l conf/schema.xml:该文件是索引的schema,包含了域类型的定义以及相关联的analyzer链。
l conf/solrconfig.xml:该文件是Solr的主配置文件。
l conf/xslt:该目录包含了各种XSLT文件,能将Solr的查询响应转换成不同的格式,如:Atom/RSS等。
3) data:包含了Lucene的二进制索引文件。
4) lib:该目录是可选的。用来放置附加的Java JAR文件,Solr在启动时会自动加载该目录下的JAR文件。这就使得用户可以对Solr的发布版本(solr.war)进行扩展。如果你的扩展并不对Solr本身进行修改,那么就可以将你的修改部署到JAR文件中放到这里。
Solr是如何找到运行所需要的home目录的呢?
Solr首先检查名为solr.solr.home的Java系统属性,有几种不同的方式来设置该Java系统属性。一种不管你使用什么样的Java应用服务器或Servlet引擎都通用的方法是在调用Java的命令行中进行设置。所以,你可以在启动Jetty的时候显式地指定Solr的home目录java -Dsolr.solr.home=solr/ -jar start.jar。另一种通用的方法是使用JNDI,将home目录绑定到java:comp/env/solr/home。并向src/webapp/web/WEB-INF/web.xml添加以下一段代码:
1 env-entry
2 env-entry-namesolr/home/env-entry-name
3 env-entry-valuesolr//env-entry-value
4 env-entry-typejava.lang.String/env-entry-type
5 /env-entry
实际上这段XML在web.xml文件中已经存在,你只需要把原来注释掉的xml取消注释,添加你所要指向的home目录即可。因为修改了web.xml文件,所以你需要运行antdist-war来重新打包之后再部署WAR文件。
最后,如果Solr的home目录既没有通过Java系统属性指定也没有通过JNDI指定,那么他将默认指向solr/。
在产品环境中,我们必须设置Solr的home目录而不是让其默认指向solr/。而且应该使用绝对路径,而不是相对路径,因为你有可能从不同的目录下面启动应用服务器。
注:Jetty 是一个开源的servlet容器,它为基于Java的web内容,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和web连接。
我们先从使用者的角度出发,最先看到的当然是servlet,因为Solr本身是个独立的网络应用程序,需要在Servlet容器中运行来提供服务,所以servlet是用户接触的最外层。我们看看org.apache.solr.servlet包。这个包很简单,只有两个类:SolrServlet和SolrUpdateServlet.我们很容易从类名中猜出这两个类的用途。
SolrServlet类继承HttpServlet类,只有四个方法:
· init()
· destroy()
· doGet()
· doPost()
SolrServlet类中除了普通的Java类对象(包括Servlet相关的)外,有四个Solr本身的类,还有一个Solr本身的异常。其中两个类和一个异常属于org.apache.solr.core包,两个类属于org.apache.solr.request包。属于core包的有:
· Config:
· SolrCore:
属于request包的有:
· SolrQueryResponse:
· QueryResponseWriter:
分析一下这个SolrServlet类。首先servlet会调用init()方法进行初始化:通过Context查找java:comp/env/solr/home来确定Solr的主目录(home),接着调用Config.setInstanceDir(home)方法设置这个实例的目录。然后通过SolrCore.getSolrCore()来获得一个SolrCore实例。destroy()方法将会在Servlet对象销毁时调用,仅仅调用core.close()关闭SolrCore实例。
当用户请求进来时doPost()简单地将任务交给doGet()完成,主要的任务由doGet()完成。分析一下doGet()方法:
1) 使用SolrCore和doGet()参数request生成一个SolrServletRequest对象(注意:这个SolrServletRequest类不是公开类,位于org.apache.solr.servlet包中,继承了SolrQueryRequestBase类,仅仅接受SolrCore和HttpServletRequest对象作为参数)
2) 然后SolrCore执行execute()方法(参数为SolrServletRequest和SolrQueryResponse)
由此可见,真正的处理核心是SolrCore的execute方法
如何在linux中启动solr
1.2. tomcat调优
调优tomcat 加大内存和连接数
MaxThread 500
MinSpareThread 25
MaxSpareThread75
Xmx 1024M
1.3. 操作系统网络参数优化
用做测试的各台服务器,均在/etc/sysctl.conf配置文件中增加如下内核参数:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 5
1.4. 下载solr
下载地址:
详情请见:
2. 安装过程
2.1. 安装tomcat6
安装完tomcat后修改./conf/server.xml
Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/
注:如果没有设置URIEncoding="UTF-8",在提交查询的select的url会出现乱码,当然也就查不到了。
2.2. 拷贝solr.war
将下载的solr包下面的dist文件夹中的apache-solr-1.4.1.war 拷贝到 tomcat的webapps 并且改名为 solr.war 一般情况下会自动生成相应的文件夹。
2.3. 拷贝其它
新建/opt/solr-tomcat/solr文件夹,把下载的solr包中的example/solr文件夹下面的所有文件放入到/opt/solr-tomcat/solr里面。
2.4. 配置solr.home
最后一步 配置添加solr.home环境变量,可以有二种方式(两种取其一即可):
a)基于环境变量
linux在当前用户的环境变量中(.bash_profile)或在./bin/catalina.sh中添加如下环境变量:
export JAVA_OPTS="$JAVA_OPTS -Dsolr.solr.home=/opt/solr-tomcat/solr"
b)基于JNDI
在tomcat的conf文件夹建立Catalina文件夹,然后在Catalina文件夹中在建立localhost文件夹,在该文件夹下面建立 solr.xml,Xml代码:
Context docBase="/usr/local/tomcat6/webapps/solr.war" debug="0" crossContext="true"
Environment name="solr/home" type="Java.lang.String" value="/opt/solr-tomcat/solr" override="true" /
/Context
注:如果没有设定solr.solr.home环境变量或JNDI的情况下,Solr查找./solr,因此在启动时候需要切换到/opt/solr-tomcat
3. 验证安装
访问solr管理界面
3.1. 打开管理后台
打开浏览器,输入:
(注:多核心时为这个地址,首页会列出多核的链接,点击进入),就可以访问solr服务了
3.2. 如果出现如下图示,表示配置成功
如何将solr6.2部署到tomcat中
(3).将E:\kingdom\solr\solr-6.3.0\server\lib\ext下面的jar包拷贝到solr_web/WEB-INF/lib下面。
(4).复制server/resources下的log4j.properties到solr_web/WEB-INF/classes下面,如果没有classes目录,就新建classes目录。
(5)修改web.xml文件,关联到solr配置文件,这样在tomcat容器启动后,再启动solr服务器框架时,就会去读取这些配置文件,初始化solr框架。在web.xml中找到节点env-entry,默认是注释的,去掉注释。节点配置如下:节点名称solr/home,对应的值为:E:\kingdom\solr\solr_web\solrhome,这个值就是你的solr配置文件的存放路径。可自定义。修改后
solr5.5需要配置中文分析吗
需要。
在solr中默认是中文分析器,需要手工配置。配置一个FieldType,在FieldType中指定中文分析器。
1、使用 IK-Analyzer中文分析器 将该分析器文件上传服务器 /opt/tools/IK Analyzer 2012FF_hf1
2、将需要把分析器的jar包(IKAnalyzer2012FF_u1.jar)添加到solr工程中。
[root@localhost IK Analyzer 2012FF_hf1]# cp IKAnalyzer2012FF_u1.jar /usr/local/solr4/tomcat7/webapps/solr/WEB-INF/lib/
3、把IKAnalyzer需要的扩展词典及停用词词典、配置文件复制到solr工程的classpath。
(1) 在usr/local/solr4/tomcat7/webapps/solr/WEB-INF/目录下创建classes目录 [root@localhost WEB-INF]# mkdir classes
(2)复制文件 [root@localhost IK Analyzer 2012FF_hf1]# cp IKAnalyzer.cfg.xml ext_stopword.dic mydict.dic /usr/local/solr4/tomcat7/webapps/solr/WEB-INF/classes
ext_stopword.dic:扩展词词典
mydict.dic:停用词词典
注意:扩展词典及停用词词典的字符集必须是utf-8。不能使用windows记事本编辑。
4、配置fieldType。需要在solrhome/collection1/conf/schema.xml中配置。技巧:使用vi、vim跳转到文档开头gg。跳转到文档末尾:G
在文件末尾添加fieldType
fieldType name="text_ik" class="solr.TextField"
analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/
/fieldType
name="text_ik":一个标识可以随便写
class="solr.TextField":分词分析器
网友评论
最新评论
rServer server = new HttpSolrServer(url);//If you wish to delete all the data from the index, do this //server.deleteByQuery( "*:*" )
r的Web页面,包括Servlet和JSP文件,其构成了前面提到的WAR文件。管理Solr的JSP页面在web/admin目录下面,如果你有兴趣折腾Solr可以找到相应的JSP的页面对其进行设置1.4.2 Solr home说明
build过程中生成的,其中包含了未被打包成jar或是war的class文件以及一些文档文件。2) client:该目录包含了特定语言的Solr客户端API,使得使用其他