//本例使用的是4.10.2的版本为入门
java -jar start.jar
启动solr
访问http://localhost:8983/solr/
服务启动后,里面没有任何数据,我们需要添加一些测试数据,通过posting命令向solr服务器添加一个xml文档,解压项目目录exampledocs中包含的文件,运行命令
java -jar post.jar solr.xml monitor.xml
solr.xml 文件内容如下:
monitor.xml文件内容如下:
效果:
通过上面的地址我们发现,这个查询相当于一个httpget请求,也就是我们通过一个地址访问了solr服务器,访问地址就是通过查询条件拼接出来的:
http://192.168.1.100:8983/solr/select?q=name:3007WFP
访问此地址栏,结果如下:
以上就是我们使用solr的桌面客户端工具展示返回的结果,如果我们需要在程序中使用这些返回值的话,就需要另外一个工具了——solrJ。
为了方便的操作solr服务器,apache为我们提供了solrJ工具,我们可以通过solrj对solr服务器进行创建索引
、更新
、查询
、处理返回值等等操作,它其实相当于solr服务器和我们程序进行数据通信的桥梁
——solrJ。
使用solrJ,必须导入相应的jar包,这里推荐使用maven工具,注意使用4.0.0版本以上jar包,在pom中配置:
<dependency>
<artifactId>solr-solrj</artifactId>
<groupId>org.apache.solr</groupId>
<version>4.0.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
下面就开始solrj之旅。
重要的对象介绍:
1、
HttpSolrServer
:此对象用于连接solr服务器。所有的对solr服务器进行CRUD都需要此对象玩好呢个,我们可以说它就是solr客户端的核心对象。
2、SolrQuery
:用于封装查询条件,我们可以将我们的查询条件包括分组、排序等全部封装到这个对象中,然后由HttpSolrServer对象来执行查询对象。
3、QueryResponse
:这个对象就是对response对象的封装,是用来封装返回值
的,我们可以通过这个对象的getResults()方法
得到solr服务器的返回数据。
4、SolrDocumentList
:这是一个集合对象,是solr服务器对象QueryResponsegetResults()方法
返回的对象,类似jdbc中的ResultSet对象,我们可以得到我们想要的结果,通过一次简单的迭代就可以。
-
实现:
- a)连接服务器,使用HttpSolrServer连接服务器
String url = "http://192.168.1.100:8983/solr";
HttpSolrServer server = new HttpSolrServer(url);
server.setSoTimeout(3000); // socket read timeout
server.setConnectionTimeout(1000);
server.setDefaultMaxConnectionsPerHost(1000);
server.setMaxTotalConnections(10);
server.setFollowRedirects(false); // defaults to false
server.setAllowCompression(true);
server.setMaxRetries(1);
-
实现:
-
b)清空现有的索引
deleteByQuery
:
try {
server.deleteByQuery("*:*");
} catch (SolrServerException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
-
实现:
-
c)构造索引
SolrInputDocument
:
//构造document1
SolrInputDocument doc1 = new SolrInputDocument();
doc1.addField( "id", "id1", 1.0f );
doc1.addField( "name", "doc1", 1.0f );
doc1.addField( "price", 10 );
//构造document2
SolrInputDocument doc2 = new SolrInputDocument();
doc2.addField( "id", "id2", 1.0f );
doc2.addField( "name", "doc2", 1.0f );
doc2.addField( "price", 20 );
//构造document集合
Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
docs.add(doc1);
docs.add(doc2);
//将documents集合 提交给httpSolrServer
try {
server.add(docs);
} catch (SolrServerException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
//提交一个commit(方法一)
try {
server.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
-
实现:
-
d)设置查询条件
SolrQuery
:
//设置查询条件
SolrQuery query = new SolrQuery();
query.setQuery("*:*");
query.addField("name");
query.setStart(0);
query.setRows(4);
query.addSortField("id", SolrQuery.ORDER.desc);
//query.addSortField("auction_point", SolrQuery.ORDER.asc);
-
实现:
-
e)处理查询结果
QueryResponse
和SolrDocumentList
(相当于JDBC的ResultSet对象,迭代结果):
//处理查询结果
QueryResponse qrsp = null;
try {
qrsp = server.query(query);
} catch (SolrServerException e) {
e.printStackTrace();
}
SolrDocumentList docsT = qrsp.getResults();
Iterator i = docs.iterator();
while(i.hasNext()){
System.out.println(i.next());
}
运行结果:
以上就是简单的入门程序。
我们使用solr作为全文索引的服务器,那么必须要为solr提供数据源,solr服务器总结了三种数据源,分别是:
:A )使用命令提供数据源
:B )SolrJ提供数据源
:C )配置文件配置数据源
下面分别介绍这三种方式:
一)使用命令配置数据源:
1 环境
本文以linux环境作为示例介绍此功能,操作环境centOS。
2 数据源
以现有的,Apache官方demo提供的XML文件作为示例数据源。
3 实现
java -jar post.jar solr.xml monitor.xml
monitor数据
4 测试结果:
一)使用solrJ配置数据源:
1 环境
使用HttpSolrServer对象,需要引入solr-solrj-4.0.0.jar文件。
2 数据源
我们直接构造SolrInputDocument对象作为solr引擎的数据源。
3 实现
String url = "http://192.168.22.216:8983/solr";
HttpSolrServer server = new HttpSolrServer(url);
server.setSoTimeout(3000); // socket read timeout
server.setConnectionTimeout(1000);
server.setDefaultMaxConnectionsPerHost(1000);
server.setMaxTotalConnections(10);
server.setFollowRedirects(false); // defaults to false
server.setAllowCompression(true);
server.setMaxRetries(1);
//构造document1
SolrInputDocument doc1 = new SolrInputDocument();
doc1.addField( "id", "id1", 1.0f );
doc1.addField( "name", "doc1", 1.0f );
doc1.addField( "price", 10 );
//构造document2
SolrInputDocument doc2 = new SolrInputDocument();
doc2.addField( "id", "id2", 1.0f );
doc2.addField( "name", "doc2", 1.0f );
doc2.addField( "price", 20 );
//构造document集合
Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
docs.add(doc1);
docs.add(doc2);
//将documents提交给solr
try {
server.add(docs);
} catch (SolrServerException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
//提交一个commit(方法一)
try {
server.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
4 测试
三 使用配置文件配置数据源
1 环境
操作系统:centOS
数据库:MySQL
2 数据源
使用数据库的一张表作为solr服务器的数据源。
表结构如下:
-
3 实现
-
a)配置数据源:
根据/usr/local/solr-4.7.2/example/solr/collection1/conf/
目录,找到solr-config.xml
配置文件,在<requestHandler name="/select" class="solr.SearchHandler">
的前面,添加dataimport的处理handler。
<requestHandler name="/dataimport"class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
说明:
此配置文件用于配置solr服务器的数据来源,即可以通过数据库获取数据源。
-
3 实现
-
b)配置数据源:
在同目录下找到data-config.xml
,如果没有则添加一个,配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.21.20:3306/jfinal_demo" user="root" password="123456" batchSize="-1" />
<document name="testDoc">
<entity name="user" pk="id"
query="select * from user">
<field column="id" name="id"/>
<field column="userName" name="userName"/>
<field column="userAge" name="userAge"/>
<field column="userAddress" name="userAddress"/>
</entity>
</document>
</dataConfig>
说明:
此配置用于配置数据库数据源,类似持久层配置文件。
dataSource用于配置服务器、数据库驱动、用户、密码等;
entity:用于配置一张表,对应一个实体,pk为主键,query为查询语句。
field:对应实体的字段,column对应数据库中的字段名称,name对应solr服务的索引名称。
-
3 实现
-
c)配置索引:
找到同目录下的schema.xml,配置如下:
(1) 保留_version_这个field
;
(2) 添加索引字段:这里每个field的name都要和data-config.xml中entity的field的name一致。
<field name="userName" type="text_general" indexed="true" stored="true" />
<field name="userAge" type="int" indexed="true" stored="true" />
<field name="userAddress" type="text_general" indexed="true" stored="true" />
说明:
因为id属性已经被配置过,所以这里不需要再次配置,否则重启solr服务时会报错。
(3) 删除多余的field,删除copyField中的设置,这些用不上。注意:text这个field不能删除,否则solr服务重启失败。
(4) 设置唯一主键: <uniqueKey>id</uniqueKey>
注意:solr服务中的索引的主键默认只支持type="String",解决办法:修改同目录下的elevate.xml,注释掉下面2行。
如图所示:
-
3 实现
-
d)配置jar包:
拷贝mysql-connector-java-5.1.22-bin.jar
和solr-dataimporthandler-4.10.3.jar
到/usr/local/solr-4.7.2\example\solr-webapp\webapp\WEB-INF\lib
。
一个是mysql的java驱动,
另一个在/usr/local/solr-4.7.2\dist
目录里,是org.apache.solr.handler.dataimport.DataImportHandler
所需的jar。
3 实现
- e)重启solr服务:
4 测试
第一种方式简单,并且数据通常不会变化,适合初学者测试服务器使用;
第二种方式数据不确定,但是变化范围小,通常用于模拟某种情形,适用于调试程序;
第三种方式数据不确定,索引维护复杂,但是功能强大,适用于一般全文索引程序使用。