您的位置:首页 > 编程语言 > Java开发

Solr6.6的安装以及Java使用SolrJ调用Solr服务,springmvc使用solr,springboot使用solr

2017-07-24 10:09 567 查看
一,Solr环境安装

1、安装Jdk1.8(solr6.6是 1.8编译的)   /    Tomcat8  /   Solr6.6   各软件

2、 下载  : 下载 solr 6.6 版本:http://www.apache.org/dyn/closer.lua/lucene/solr/6.6.0

3、将 solr 压缩包中 solr 6.6 下的server\solr-webapp\文件夹下有个webapp文件夹,将之复制到Tomcat\webapps\目录下,并改成solr (名字随意,通过浏览器进行访问solr管理界面时要用到)

4、将 solr 压缩包中 solr 6.6\server\lib\ext 中的 jar 全部复制到 Tomcat\ webapps\solr\WEB-INF\lib 目录中, solr 6.6\server\lib\中以metrics开头的jar复制到 Tomcat\ webapps\solr\WEB-INF\lib 中

5、将 solr 压缩包中 solr 6.6/ server/resources /log4j.properties 复制到Tomcat\ webapps\solr\WEB-INF\lib 目录中

6、将 solr 压缩包中 solr 6.6/server/solr/ 目录下的solr.xml,zoo.cfg,README.txt复制到计算机某个目录下,如D:\solr_home

在solr_home目录下新建一个文件建solr_core,



将 solr 压缩包中 solr 6.6/server/solr/ configsets/basic_configs目录下conf目录复制到复制到上一步新建的文件solr_core内 即:D:\solr_home\solr_core



7、打开Tomcat/webapps/solr/WEB-INF下的web.xml,找到如下配置内容(初始状态下该内容是被注释掉的):

<env-entry>

       <env-entry-name>solr/home</env-entry-name>

       <env-entry-value>/put/your/solr/home/here</env-entry-value>

       <env-entry-type>Java.lang.String</env-entry-type>

</env-entry>

将<env-entry-value>中的内容改成你的solr_home路径,这里是D:/solr_home

注释权限控制

<!--
<security-constraint>
<web-resource-collection>
<web-resource-name>Disable TRACE</web-resource-name>
<url-pattern>/</url-pattern>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint/>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Enable everything but TRACE</web-resource-name>
<url-pattern>/</url-pattern>
<http-method-omission>TRACE</http-method-omission>
</web-resource-collection>
</security-constraint>
-->


8、保存关闭,而后启动tomcat,我这里改的是8081的端口,所以在浏览器输入http://localhost:8081/solr即可出现Solr的管理界面如下:



9选中CoreAdmin来创建一个core用来保存数据



创建成功后会在solrhome/solr_core下生产data文件夹,以及core.properties文件



通过程序调用的时候可以通过url :http://ip:port/solr/solr_core来使用solr服务,solr可以建立多个core,步骤5,6重复即可

二,JAVA使用SolrJ调用Solr服务

pom中引入

<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>6.6.0</version>
</dependency>


执行java代码出现unknow filed ’name’  exception时,在solr_home目录中的conf内的配置文件managed-schema加上 field配置

<field name="name" type="string" indexed="true" stored="true"/>
<field name="description" type="string" indexed="true" stored="true"/>


JAVA代码:

package org.springframework.data.solr.showcase;

import org.apache.solr.client.solrj.beans.Field;

public class Person {
@Field
private String id;

@Field
private String name;

@Field
private String description;

public Person() {
}

public Person(String id, String name, String description) {
this.id = id;
this.name = name;
this.description = description;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}

@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", description="
+ description + "]";
}

}


package org.springframework.data.solr.showcase;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.params.FacetParams;

public class SolrTest {

//指定solr服务器的地址
private final static String SOLR_URL = "http://localhost:8081/solr/";

private String solrCore="solr_core";//指定的存储数据的collection
/**
* 创建SolrServer对象
*
* 该对象有两个可以使用,都是线程安全的
* 1、CommonsHttpSolrServer:启动web服务器使用的,通过http请求的
* 2、 EmbeddedSolrServer:内嵌式的,导入solr的jar包就可以使用了
* 3、solr 4.0之后好像添加了不少东西,其中CommonsHttpSolrServer这个类改名为HttpSolrClient
*
* @return
*/
public HttpSolrClient createSolrServer(){
HttpSolrClient solr = null;
solr = new HttpSolrClient(SOLR_URL);
solr.setConnectionTimeout(100);
solr.setDefaultMaxConnectionsPerHost(100);
solr.setMaxTotalConnections(100);
return solr;
}

public void addPersonBatch() throws IOException, SolrServerException{
List<Person> list = new ArrayList<Person>();
list.add(new Person("1","zhangsanfeng","我是张三丰"));
list.add(new Person("2","zhangsanfeng123","我是张三丰123"));
list.add(new Person("3","zhangsan123","我是张三"));
list.add(new Person("4","zhangsan123456","我是张三"));
list.add(new Person("5","lisi","李四"));
list.add(new Person("6","lisi5","我是lisi"));
list.add(new Person("7","wangwu","王五"));
list.add(new Person("8","wangwu","王五002"));
HttpSolrClient solr = new HttpSolrClient(SOLR_URL + solrCore);
solr.addBeans(list);
solr.commit();
solr.close();
}

public void addPersonIndex() throws IOException, SolrServerException{
Person p = new Person();
p.setId("9");
p.setName("zhangsan");
p.setDescription("张三");
HttpSolrClient solr = new HttpSolrClient(SOLR_URL + solrCore);
solr.addBean(p);
solr.commit();
solr.close();
}

/**
* 往索引库添加文档
* @throws IOException
* @throws SolrServerException
*/
public void addDoc() throws SolrServerException, IOException{
//构造一篇文档
SolrInputDocument document = new SolrInputDocument();
//往doc中添加字段,在客户端这边添加的字段必须在服务端中有过定义
document.addField("id", "10");
document.addField("name", "JAVA大神");
document.addField("description", "世界上最牛逼的JAVA大神");
//获得一个solr服务端的请求,去提交  ,选择具体的某一个solr core
HttpSolrClient solr = new HttpSolrClient(SOLR_URL + solrCore);
solr.add(document);
solr.commit();
solr.close();
}

/**
* 根据id从索引库删除文档
*/
public void deleteDocumentById() throws Exception {
//选择具体的某一个solr core
HttpSolrClient server = new HttpSolrClient(SOLR_URL+solrCore);
//删除文档
//        server.deleteById("8");
//删除所有的索引
server.deleteByQuery("*:*");
//提交修改
server.commit();
server.close();
}

/**
* 查询
* @throws Exception
*/
public void querySolr() throws Exception{
HttpSolrClient solrServer = new HttpSolrClient(SOLR_URL+solrCore);
SolrQuery query = new SolrQuery();
//下面设置solr查询参数
//        query.set("q", "*:*");// 参数q  查询所有
//        query.set("q","*zhangsan*");//相关查询,比如某条数据某个字段含有周、星、驰三个字  将会查询出来 ,这个作用适用于联想查询

//参数fq, 给query增加过滤查询条件
//        query.addFilterQuery("id:[0 TO 9]");//id为0-9

//给query增加布尔过滤条件
//query.addFilterQuery("description:演员");  //description字段中含有“演员”两字的数据

//参数df,给qu
d23b
ery设置默认搜索域
//        query.set("df", "name");

query.setQuery("name:*");
//        query.setQuery("name:*zhangsan* OR name:*123*" );//name 包含zhangsan或者123
//        query.setQuery("name:*zhangsan* AND description:*zhangsan*" );// name包含且

//分组查询
query.setFacet(true);
query.addFacetField("name","description");//两个域有各自独立的结果
/*
* FacetComponet有两种排序选择,分别是count和index,
* count是按每个词出现的次数,index是按词的字典顺序。如果查询参数不指定facet.sort,solr默认是按count排序。
*/
query.setFacetSort(FacetParams.FACET_SORT_COUNT);
/*query.setFacetLimit(101);  */ // 设置返回结果条数 ,-1表示返回所有,默认值为100
/* query.setParam(FacetParams.FACET_OFFSET, "100");*/   //开始条数,偏移量,它与facet.limit配合使用可以达到分页的效果
query.setFacetMinCount(1);//设置 限制 count的最小返回值,默认为0
query.setFacetMissing(false);//不统计null的值
/* query.setFacetPrefix("test");//设置前缀 */

//参数sort,设置返回结果的排序规则
//        query.addSort("id",SolrQuery.ORDER.asc);
//        query.addSort("name", SolrQuery.ORDER.desc);

//设置分页参数
//        query.setStart(0);
//        query.setRows(10);//每一页多少值

//参数hl,设置高亮
query.setHighlight(true);
//设置高亮的字段
query.addHighlightField("name");
//设置高亮的样式
query.setHighlightSimplePre("<font color='red'>");
query.setHighlightSimplePost("</font>");

//获取查询结果
QueryResponse response = solrServer.query(query);
//两种结果获取:得到文档集合或者实体对象

// 获取高亮数据结果
//Map<String, Map<String, List<String>>> map = response.getHighlighting();

// 得到FacetField结果
System.out.println(response.getFacetFields());

//获取高亮数据结果
System.out.println("高亮数据结果"+response.getHighlighting());

//查询得到文档的集合
SolrDocumentList solrDocumentList = response.getResults();
System.out.println("通过文档集合获取查询文档数量:"+solrDocumentList.getNumFound());
//遍历列表
for (SolrDocument doc : solrDocumentList) {
System.out.println("id:"+doc.get("id")+"   name:"+doc.get("name")+"    description:"+doc.get("description"));
}

//得到实体对象
List<Person> tmpLists = response.getBeans(Person.class);
if(tmpLists!=null && tmpLists.size()>0){
System.out.println("实体对象赋值内容:");
for(Person per:tmpLists){
System.out.println(per.toString());
}
}
}

public static void main(String[] args) throws Exception {
SolrTest solr = new SolrTest();
//solr.createSolrServer();
solr.addDoc();
solr.addPersonIndex();
solr.addPersonBatch();
//        solr.deleteDocumentById();
solr.querySolr();
}

}


测试结果:

分组结果:[name:[wangwu (2), JAVA大神 (1), lisi (1), lisi5 (1), zhangsan (1), zhangsan123 (1), zhangsan123456 (1), zhangsanfeng (1), zhangsanfeng123 (1)], description:[我是张三 (2), 世界上最牛逼的JAVA大神 (1), 张三 (1), 我是lisi (1), 我是张三丰 (1), 我是张三丰123 (1), 李四 (1), 王五 (1), 王五002 (1)]]
高亮数据结果:{3={name=[<font color='red'>zhangsan123</font>]}, 2={name=[<font color='red'>zhangsanfeng123</font>]}, 1={name=[<font color='red'>zhangsanfeng</font>]}, 10={name=[<font color='red'>JAVA大神</font>]}, 7={name=[<font color='red'>wangwu</font>]}, 6={name=[<font color='red'>lisi5</font>]}, 5={name=[<font color='red'>lisi</font>]}, 4={name=[<font color='red'>zhangsan123456</font>]}, 9={name=[<font color='red'>zhangsan</font>]}, 8={name=[<font color='red'>wangwu</font>]}}
通过文档集合获取查询文档数量:10
id:10   name:JAVA大神    description:世界上最牛逼的JAVA大神
id:9   name:zhangsan    description:张三
id:1   name:zhangsanfeng    description:我是张三丰
id:2   name:zhangsanfeng123    description:我是张三丰123
id:3   name:zhangsan123    description:我是张三
id:4   name:zhangsan123456    description:我是张三
id:5   name:lisi    description:李四
id:6   name:lisi5    description:我是lisi
id:7   name:wangwu    description:王五
id:8   name:wangwu    description:王五002
实体对象赋值内容:
Person [id=10, name=JAVA大神, description=世界上最牛逼的JAVA大神]
Person [id=9, name=zhangsan, description=张三]
Person [id=1, name=zhangsanfeng, description=我是张三丰]
Person [id=2, name=zhangsanfeng123, description=我是张三丰123]
Person [id=3, name=zhangsan123, description=我是张三]
Person [id=4, name=zhangsan123456, description=我是张三]
Person [id=5, name=lisi, description=李四]
Person [id=6, name=lisi5, description=我是lisi]
Person [id=7, name=wangwu, description=王五]
Person [id=8, name=wangwu, description=王五002]


springboot配置:https://git.oschina.net/kerry_li/spring-data-solr-showcase

springmvc 配置:https://git.oschina.net/kerry_li/spring-solr-test
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐