solr 搭建(基于4.10.3) 结合 Tomcat ,java 操作 solr
- 下载solr包
http://archive.apache.org/dist/lucene/solr
- 安装solr
- 解压solr
tar -zxvf solr-4.10.3.tgz.tar -C /usr/local/
- 重命名solr( 可选 )
mv solr-4.10.3 solr
- 上传tomcat,解压
tar -zxvf apache-tomcat-7.0.68.tar.gz -C /usr/local/
mv apache-tomcat-7.0.68 tomcat
- solr与tomcat集成
- 将
solr/example/webapps
中的solr.war
拷贝到tomcat/webapps/
中cp solr.war /usr/local/tomcat/webapps
- 进入tomcat/webapps
解压solr.war
>cd /usr/local/tomcat/webapps && mkdir solr && unzip solr.war -d solr && rm -rf solr.war
- 修改solr/WEB-INF/web.xml
文件中的nv-entry
标签的solr/home地址为/usr/local/solr/example/solr
,保存退出
>vim solr/WEB-INF/web.xml
>
> 修改参数:
>xml <env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value>/usr/local/solr/example/solr</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry>
- 拷贝相关jar到tomcat
>cd /usr/local/solr/example/lib/ext && cp * /usr/local/tomcat/lib/
- 启动tomcat
>./catalina.sh start
- 查看日志( 可选 )
>tail -f -n 500 /usr/local/tomcat/logs/catalina.out
- 通过浏览器访问solr管控台
>http://ip:8080/solr
,注意关闭防火墙(service iptables stop)
>
- 将
- 完毕
- 解压solr
- solr 结合 java
- 引入jar
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>4.10.3</version>
</dependency> - 使用java添加数据到solr
- 实体bean中,在需要搜索条件上加
@Field
注解(通过addBean方式提交),添加@Field
,solr才会对该字段的值进行分词添加索引代码如下:
public class User {
private int id;
@Field("name")
private String name;
private int price;
private String url;
} - 同时到
/usr/local/solr/example/solr/collection1/conf
中,在schema.xml
添加需要搜索的field
,对应实体注解@Field
(通过addBean方式提交)字段,vim /usr/local/solr/example/solr/collection1/conf/schema.xml
比如:
<field name="sku" type="text_en_splitting_tight" indexed="true" stored="true" omitNorms="true"/>
<field name="name" type="text_general" indexed="true" stored="true"/>
<field name="manu" type="text_general" indexed="true" stored="true" omitNorms="true"/>
<field name="cat" type="string" indexed="true" stored="true" multiValued="true"/>
<field name="features" type="text_general" indexed="true" stored="true" multiValued="true"/>
注意:以上```xml name : 搜索字段名 type :分词类型(String\date等等) indexed : 是否被索引 stored : 是否被储存 multiValued : 是否存储多个值 required : 是否必须字段
field
只是例子,solr
自身提供的schema.xml
已经存在field
,如果需要自定义,可自行添加 - 通过SolrServer添加数据到solr
代码如下:
private static final String URL = "http://192.168.58.144:8080/solr";//solr操作url
@Resource
private IUserService userService;
@Test
public void addField() throws IOException, SolrServerException {
List<User> list = userService.list();
//实例化solr对象
SolrServer server = new HttpSolrServer(URL);
SolrInputDocument document = null;
for (User u : list) {
//实例化数据加载类
document = new SolrInputDocument();
document.addField("id",u.getId());
document.addField("name",u.getName());
document.addField("price",u.getPrice());
document.addField("url",u.getUrl());
server.add(document);
}
server.commit();//提交数据
}
注意:方式二必须要在实体**注意:`document.addField(key,value); key`对应`schema.xml`中必须存在`name`的值为`key`的`field`,否则将报错;`value`则为对应的值** > ```java //方式二 @Test public void addField2() throws IOException, SolrServerException { List<User> list = userService.list(); //实例化solr对象 SolrServer server = new HttpSolrServer(URL); //实例化数据加载类 for (User u : list) { //直接添加实体对象 server.addBean(u); } server.commit(); }
bean
中的属性加上@Field
注解,才能生效,否则报错 - 通过
SolrServer
搜索代码如下:
public void searchField() throws SolrServerException {
SolrServer server = new HttpSolrServer(URL);
//查询类
SolrQuery query = new SolrQuery();
//查询条件
query.set("q", "name:黎 AND price:{15 TO 25}");//AND 分隔
//query.addFilterQuery("id:1");//AND 分隔
query.set("fl", "id,name");//返回字段值,不返回则为null
query.setSort("price", SolrQuery.ORDER.asc);
query.setHighlight(true); //开启高亮
query.setHighlightFragsize(10); //返回的字符个数
query.setHighlightRequireFieldMatch(true);
query.setHighlightSimplePre("<font color="red">"); //前缀
query.setHighlightSimplePost("</font>"); //后缀
query.setParam("hl.fl", "name"); //高亮字段
query.setStart(0);
query.setRows(10);
//查询数据
QueryResponse response = server.query(query);
Map<String, Map<String, List<String>>> maps = response.getHighlighting();//获取高亮信息
//数据结果
SolrDocumentList list = response.getResults();
for (SolrDocument doc : list){
System.out.println("--------------------");
System.out.println("|--" + doc.getFieldValue("id"));
System.out.println("|--" + doc.getFieldValue("name"));
System.out.println("|--" + doc.getFieldValue("price"));
System.out.println("|--" + doc.getFieldValue("url"));
System.out.println("|--" + maps.get(doc.getFieldValue("id").toString()));//高亮信息 高亮信息返回方式 id:value
System.out.println("--------------------");
}
注意:部分查询参数解析: ```xml - q : 查询字符串,必须项,一个或多个field - fq(filter query) : 过滤查询,0个或多个field - sort : 排序(asc、desc),默认相关性降序 - start,rows : 分页(指定从多少开始获取多少条记录) - fl : 指定返回哪些字段内容 - wt : 指定输出格式,可以是xml、json等 - hl.fl :表示高亮的field,也就是高亮的区域
q
和fq
的区别,两者都为查询,但是q为全局查询;fq
为过滤,即对q
的结果进行过滤,强调效率性能,但是不要在两者都添加对同一field
进行查询,这样反而降低查询效率,增加查询性能开销。 - 删除
solr
数据代码如下:
public void deleteField() throws IOException, SolrServerException {
SolrServer server = new HttpSolrServer(URL);
server.deleteById("1");
server.commit();
}以上是基于solrj方式对solr进行操作。可参考[solr-wiki文档api](http://wiki.apache.org/solr/FrontPage)
- 实体bean中,在需要搜索条件上加
- 引入jar
作者:逐暗者 (转载请注明出处)