【标题:solr整合TOMCAT+导入数据并创建索引+solrj操作】
【说明:这里是我这两天学习solr的一个整理,有很多不详细的地方,但是都可以在网上找到!】
一 solr整合tomcat:
1 下载solr:http://lucene.apache.org/solr/,解压(不同版本解压得到的文件夹可能不一样,我用的是solr4.10.1)
2 把solr客户端(注意这里是客户端)部署到TOMCAT:将solr-4.10.0\example\webapps\solr.war 到 apache-tomcat-8.0.12\webapps\目录中
3 建立solr的core
(1)core:Solr里面的core就像数据库里面的一个表,用来管理索引和相关配置
(2)最简单的办法是:
直接把solr-4.10.1\example\solr全部拷贝过去就行,例如放到D:\solr\...,这样solr的core就建好了
目录如下图:
(3)solr建好了后,要告诉solr客户端core在哪里,配置tomcat中你发布的solr项目(solr.war解压生成的或者tomcat启动解析生成的),找到下面这一段,打开注释,红色部分修改为你的core的路径就行:
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>E:/apache-tomcat-6.0.39/bin/solr</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
二 导入数据并创建索引(索引就是filed):数据库(以oracle为例)和文件(以pdf为例)
(一)导入oracle数据库并创建索引:
1 导入3个jar包到tomcat solr客户端WEB-INF中的lib:
(1)solr-dataimporthandler-extras-4.7.0.jar;在solr发布包solr-4.7.0\dist里面有
(2)solr-dataimporthandler-4.7.0.jar;在solr发布包solr-4.7.0\dist里面有
(3)oracle的驱动jar包
2 告诉solr的core我配置了一个数据库源
(1)修改core里面的solrConfig.xml:
- <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
- <lst name="defaults">
- <str name="config">data-config.xml</str>
- </lst>
- </requestHandler>
(2)新建data-config.xml(在core里面的conf文件夹里新建,与solr一个目录),其中有一些中文注释请好好读一下:
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource type="JdbcDataSource" driver="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:heer_oa_dev/heerok@59.173.240.149:1521:heer" user="heer_oa_dev" password="heerok"/>
<document>
<entity name="OA_SETTING" query="SELECT ID,SJ,SZ,SCRQ from OA_SETTING">
<field column="ID" name="id" />
<!-- 1 column与数据库中的对应
2这里的name一定要在schema.xml中的filed中定义,我这里用的dynamicField -->
<field column="SJ" name="sj_s" />
<!-- 最后的查询结果的列的显示:
1 query和filed中都有的字段才会被查出来
2 字段名称是name的值
-->
<field column="SZ" name="sz_s" />
<field column="SCRQ" name="scrq_dt" />
</entity>
</document>
</dataConfig>
(3)修改schema.xml(这里有所有的字段,对应着data-config.xml里面的name,里面的_s _dt都是dynamicField),schema.xml中的filed就是索引的字段,filedType是索引字段的类型,下面给一个日期类型的例子:
<dynamicField name="*_dt" type="date" indexed="true" stored="true"/>
<fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>
(二)导入文件并创建索引,以PDF为例子
1 导入jar包:
(1)在core下面新建文件夹extract,把solr-4.7.0\contrib\extraction\lib下所有jar包到extract文件夹下
(2)把solr-4.10.1/dist和solr-4.10.1/contrib都直接拷贝到core下面去,最后的结果如下图所示
说明:为什么要把这么多的jar包都拷贝过去,用于solrconfig.xml中的lib,如果没有导入这些jar包的话,在后面用sorlj操作的时候会报classnotfound的错误(如果你仔细的话会发现里面有很多重复的jar包,你可以直接找出来然后把jar包都放到extra文件夹中)
(3)修改solrConfig.xml:
这里配置的uprefix的意思是:
也就是solr在解析文件的时候,文件本身有很多属性,具体有哪些属性是不确定的,solr全部把他解析出来以attr作为前缀加上文件本身的属性名。这个attr_就是索引了,也就是字段,所以在schema中也要配置。
- <requestHandler name="/update/extract" class="solr.extraction.ExtractingRequestHandler" >
- <lst name="defaults">
- <str name="fmap.content">text</str>
- <str name="lowernames">true</str>
- <str name="uprefix">attr—</str> (attr_)
- <str name="captureAttr">true</str>
- </lst>
- </requestHandler>
(这里原来是../../)
<lib dir="E:\apache-tomcat-6.0.39\bin\solr\extract" regex=".*\.jar" />
<lib dir="../contrib/extraction/lib" regex=".*\.jar" />
<lib dir="../dist/" regex="solr-cell-\d.*\.jar" />
<lib dir="../contrib/clustering/lib/" regex=".*\.jar" />
<lib dir="../dist/" regex="solr-clustering-\d.*\.jar" />
<lib dir="../contrib/langid/lib/" regex=".*\.jar" />
<lib dir="../dist/" regex="solr-langid-\d.*\.jar" />
<lib dir="../contrib/velocity/lib" regex=".*\.jar" />
<lib dir="../dist/" regex="solr-velocity-\d.*\.jar" />
(突然看到还有下面这个地方要改,漏掉了,data下面放的是索引文件的二进制文件)
<dataDir>${solr.data.dir:E:/apache-tomcat-6.0.39/bin/solr/collection1/data}</dataDir>
(4)这个attr_就是索引了,也就是字段field,所以也需要在schema.xml中配置:
<dynamicField name="attr_*" type="text_general" indexed="true" stored="true" multiValued="true"/>
三 用solrj操作:这里没有用Junit,直接写的main
package com.heer;
import java.io.File;
import java.io.IOException;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.request.AbstractUpdateRequest;
import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.params.SolrParams;
public class SolrExample {
private static SolrServer server = new HttpSolrServer("http://localhost:8080/solr/");
public final static void fail(Object o) {
System.out.println(o);
}
public static void query(String query) {
SolrParams params = new SolrQuery(query);
try {
QueryResponse response = server.query(params);
SolrDocumentList list = response.getResults();
for (int i = 0; i < list.size(); i++) {
fail(list.get(i));
}
} catch (SolrServerException e) {
e.printStackTrace();
}
}
public static void addDoc() {
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", 1);
doc.addField("name","Solr Input Document");
doc.addField("manu", "this is SolrInputDocument content");
doc.addField("mytest","my test solr Solr");
try {
// 添加一个doc文档
UpdateResponse response = server.add(doc);
fail("server.commit(): "+server.commit());// commit后才保存到索引库
fail("response: "+response);
fail("query time:" + response.getQTime());
fail("Elapsed Time:" + response.getElapsedTime());
fail("status:" + response.getStatus());
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
query("name:solr");
}
public static void addBean(){
Index index = new Index();
index.setId("4");
index.setName("add bean index");
index.setManu("index bean manu");
index.setCat(new String[] { "a1", "b2" });
try {
//添加Index Bean到索引库
UpdateResponse response = server.addBean(index);
fail(server.commit());//commit后才保存到索引库
fail(response);
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
queryAll();
}
public static void queryAll() {
ModifiableSolrParams params = new ModifiableSolrParams();
// 查询关键词,*:*代表所有属性、所有值,即所有index
params.set("q", "*:*");
// 分页,start=0就是从0开始,,rows=5当前返回5条记录,第二页就是变化start这个值为5就可以了。
params.set("start", 0);
params.set("rows", Integer.MAX_VALUE);
// 排序,,如果按照id 排序,,那么将score desc 改成 id desc(or asc)
//params.set("sort", "score desc");
// 返回信息 * 为全部 这里是全部加上score,如果不加下面就不能使用score
params.set("fl", "*,score");
try {
QueryResponse response = server.query(params);
SolrDocumentList list = response.getResults();
for (int i = 0; i < list.size(); i++) {
fail(list.get(i));
}
} catch (SolrServerException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
//addDoc();
//addBean();
String fileName = "F:/Apache_Shiro开发文档.pdf";
String solrId = "Apache_Shiro开发文档.pdf";
try {
indexFilesSolrCell(fileName, solrId);
}
catch (IOException e)
{
e.printStackTrace();
}
catch (SolrServerException e)
{
e.printStackTrace();
}
}
/** 从文件创建索引
* <功能详细描述>
* @param fileName
* @param solrId
* @see [类、类#方法、类#成员]
*/
public static void indexFilesSolrCell(String fileName, String solrId)
throws IOException, SolrServerException
{
String urlString = "http://localhost:8080/solr/collection1";
SolrServer solr = new HttpSolrServer(urlString);
ContentStreamUpdateRequest up = new ContentStreamUpdateRequest("/update/extract");
String contentType="application/pdf";
up.addFile(new File(fileName), contentType);
up.setParam("literal.id", solrId);
up.setParam("uprefix", "attr_");
up.setParam("fmap.content", "attr_content");
up.setAction(AbstractUpdateRequest.ACTION.COMMIT, true, true);
solr.request(up);
SolrQuery query = new SolrQuery("*:*");
QueryResponse rsp = solr.query(query);
System.out.println(rsp);
}
}