一:Solr的搭建
1:下载
http://archive.apache.org/dist/lucene/solr/
2:安装步骤
2.1:先安装Tomcat
https://blog.youkuaiyun.com/qq_36297434/article/details/83928241
2.2:解压Solr
tar -xvf solr-4.10.3.tgz.tar
2.3:进入目录
cd solr-4.10.3/example/webapps/
2.4:拷贝其下的war目录到Tomcat的webapps下
cp solr.war /opt/module/apache-tomcat-7.0.68/webapps/
2.5:解压solr.war
mkdir solr && unzip solr.war -d solr && rm -rf solr.war
2.6:修改solr项目的web.xml
vim /opt/module/apache-tomcat-7.0.68/webapps/solr/WEB-INF/web.xml
查找到<env-entry>标签,解开注释,修改为:
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/opt/module/solr-4.10.3/example/solr</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
2.7:拷贝jar包到Tomcat下的solr
cd /opt/module/solr-4.10.3/example/lib/ext && cp * /opt/module/apache-tomcat-7.0.68/webapps/solr/WEB-INF/lib
2.8:启动tomcat
/opt/module/apache-tomcat-7.0.68/bin/startup.sh
2.9:通过浏览器访问
http://IP:8080/solr
二:安装中文分词器
1:下载:IK Analyzer 2012FF_hf1.zip
2:解压
3:安装,把IKAnalyzer2012FF_u1.jar拷贝到Tomcat下solr项目的lib目录中
cp IKAnalyzer2012FF_u1.jar /opt/module/apache-tomcat-7.0.68/webapps/solr/WEB-INF/lib
4:创建文件夹
mkdir /opt/module/apache-tomcat-7.0.68/webapps/solr/WEB-INF/classes
把IKAnalyzer.cfg.xml和stopword.dic拷贝到新创建的classes目录下即可
5:修改solr的schema文件
/opt/module/solr-4.10.3/example/solr/collection1/conf/schema.xml
#添加如下配置
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
三:JavaAPI操作Solr
1:普通
package demo1;
import java.io.IOException;
import java.util.List;
import java.util.Map;
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.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.ModifiableSolrParams;
public class Demo1 {
public static void testADD() throws SolrServerException, IOException {
//实例化solr对象
SolrServer solrServer=new HttpSolrServer("http://192.168.206.11:8080/solr/collection1");
SolrInputDocument doc1=new SolrInputDocument();
doc1.setField("id","1001");
doc1.setField("name","iphone6s手机");
doc1.setField("price", "6000");
doc1.setField("url", "image/001.jpg");
SolrInputDocument doc2=new SolrInputDocument();
doc2.setField("id","1002");
doc2.setField("name","三星s6手机");
doc2.setField("price", "5300");
doc2.setField("url", "image/002.jpg");
//设置服务器保存信息
solrServer.add(doc1);
solrServer.add(doc2);
solrServer.commit();
}
public static void testSearch() throws SolrServerException {
SolrServer solrServer=new HttpSolrServer("http://192.168.206.11:8080/solr/collection1");
//查询类,SolrQuery和ModifiableSolrParams均可
SolrQuery solrQuery=new SolrQuery();
//查询关键词
solrQuery.set("q", "name:手机");
//开始查询的索引位置
solrQuery.set("start", 0);
//查询条数
solrQuery.set("rows","20");
//价格降序排序
solrQuery.set("sort", "price desc");
//查询数据
QueryResponse response=solrServer.query(solrQuery);
//获取数据
SolrDocumentList solrDocumentList=response.getResults();
long num=solrDocumentList.getNumFound();
System.out.println("条数:"+num);
for(SolrDocument sd : solrDocumentList) {
String id=(String)sd.get("id");
String name=(String)sd.get("name");
Float price=(Float)sd.get("price");
String url=(String)sd.get("url");
System.out.println("id:"+id);
System.out.println("name:"+name);
System.out.println("price:"+price);
System.out.println("url:"+url);
System.out.println("*************************************");
}
}
public static void testDel() throws SolrServerException, IOException {
//实例化solr对象
SolrServer solrServer=new HttpSolrServer("http://192.168.206.11:8080/solr/collection1");
//deleteById形式
//solrServer.deleteById("1001");
//deleteByQuery形式
//solrServer.deleteByQuery("id:1001 OR id:1002");
solrServer.deleteByQuery("id:*");
solrServer.commit();
}
public static void testQueryCase() throws SolrServerException {
SolrServer solrServer=new HttpSolrServer("http://192.168.206.11:8080/solr/collection1");
SolrQuery params=new SolrQuery();
//AND,OR,NOT
// params.set("q","name:手机 AND price:6000");
// params.set("q","name:手机 OR price:6000");
// params.set("q","name:手机 NOT price:6000");
//TO条件:6<=price<=9
// params.set("q","name:手机 AND price:[4000 TO 6000]");
//TO条件,7<price<9,添加过滤器提高查询效率
// params.set("q","price:{4000 TO 6000}");
// params.addFilterQuery("name:手机");
//显示设置
params.setHighlight(true);//开启高亮组件
params.addHighlightField("name"); //高亮字段
params.setHighlightSimplePre("<font color='red'>");//标记,高亮关键字前缀
params.setHighlightSimplePost("</font>"); //后缀
params.setHighlightSnippets(1);//结果分片数,默认为1;
params.setHighlightFragsize(100); //每个分片的最大长度,默认100
//查询数据
QueryResponse response=solrServer.query(params);
//获取未高亮内容
SolrDocumentList solrDocumentList=response.getResults();
//获取高亮内容
Map<String, Map<String, List<String>>> hh =response.getHighlighting();
long num=solrDocumentList.getNumFound();
System.out.println("条数:"+num);
for(SolrDocument sd : solrDocumentList) {
String id=(String)sd.get("id");
String name=(String)sd.get("name");
Float price=(Float)sd.get("price");
String url=(String)sd.get("url");
//高亮字段获取
List<String> list = hh.get(sd.getFieldValue("id")).get("name");
System.out.println("id:"+id);
System.out.println("name:"+name);
System.out.println("price:"+price);
System.out.println("url:"+url);
System.out.println("*************************************");
}
}
public static void main(String[] args) throws SolrServerException, IOException {
// TODO Auto-generated method stub
testADD();
testSearch();
testQueryCase();
testDel();
}
}
2:bean和注解
package demo2.pojo;
import java.io.Serializable;
import org.apache.solr.client.solrj.beans.Field;
public class Phone implements Serializable{
private static final long serialVersionUID = 1L;
@Field("id")
String id;
@Field("name")
String name;
@Field("price")
String price;
@Field("url")
String url;
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 getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return("id:"+id+" name:"+name+" price:"+price+" url:"+url);
}
}
package demo2;
import java.io.IOException;
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.common.SolrDocument;
import demo2.pojo.Phone;
public class Demo2 {
public static void testAddPhone() throws IOException, SolrServerException {
SolrServer solrServer=new HttpSolrServer("http://192.168.206.11:8080/solr/collection1");
Phone p1=new Phone();
Phone p2=new Phone();
p1.setId("1001");
p1.setName("苹果6s手机");
p1.setPrice("6000");
p1.setUrl("image/001.jpg");
p2.setId("1002");
p2.setName("三星s6手机");
p2.setPrice("5300");
p2.setUrl("image/002.jpg");
solrServer.addBean(p1);
solrServer.addBean(p2);
solrServer.commit();
}
public static void testChange() {
SolrDocument doc=new SolrDocument();
doc.addField("id", "1001");
doc.addField("name", "苹果6s手机");
doc.addField("price", "6000");
doc.addField("url", "image/001.jpg");
SolrServer solrServer=new HttpSolrServer("http://192.168.206.11:8080/solr/collection1");
Phone p=solrServer.getBinder().getBean(Phone.class, doc);
System.out.println(p);
}
public static void main(String[] args) throws IOException, SolrServerException {
// TODO Auto-generated method stub
//testAddPhone();
testChange();
}
}
四:配置集群
准备4台机器,如IP为:
192.168.126.131
192.168.126.132
192.168.126.133
192.168.126.134
1:前三个机器配置zookeeper集群
https://blog.youkuaiyun.com/qq_36297434/article/details/98350234
2:四台机器单机配置solr
3:zookeeper连接tomcat
-DzkHost表示zookeeper地址
-Dbootstrap_confdir表示对某个solr实例下的配置统一管理
-Dcollection.configName表示配置文件别名,一般与实例名称相同。
-DnumShards表示分片数量
-DreplicationFactor表示每个分片中服务数量(2表示一主一备)
3.1:192.168.126.131机器修改tomcat 的 bin目录下catalina.sh文件,在第二行加入
JAVA_OPTS="$JAVA_OPTS -DzkHost=192.168.126.131:2181,192.168.126.132:2181,192.168.126.133:2181 -Dbootstrap_confdir=/opt/module/solrhome/collection1/conf -Dcollection.configName=collection1 -DnumShards=2 -DreplicationFactory=2"
3.2:192.168.126.132-134机器修改tomcat 的 bin目录下catalina.sh文件,在第二行加入
JAVA_OPTS="$JAVA_OPTS -DzkHost=192.168.126.131:2181,192.168.126.132:2181,192.168.126.133:2181 -DnumShards=2 -DreplicationFactory=2"
4:修改4台机器solrhome下的solr.xml
将<solrCloud>标签中的jetty.port的端口号改为与本机Tomcat相同的端口号
5:任选一个IP访问
http://192.168.126.131:8080/solr/
6:测试集群代码
package com.hhxy;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
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.junit.Test;
/**
* 增加删除修改都需要提交事务
* @author Administrator
*
*/
public class Demo {
/**
* 新增5
* @throws SolrServerException
* @throws IOException
*/
@Test
public void testInsert() throws SolrServerException, IOException{
CloudSolrClient client = new CloudSolrClient("192.168.126.131:2181,192.168.126.131:2182,192.168.126.131:2183");
client.setDefaultCollection("collection1");
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "012");
doc.addField("hhxy", "李伟康同学");
client.add(doc);
client.commit();
}
public void testDelete() throws SolrServerException, IOException{
CloudSolrClient client = new CloudSolrClient("192.168.126.131:2181,192.168.126.131:2182,192.168.126.131:2183");
client.setDefaultCollection("collection1");
client.deleteById("012");
client.commit();
}
public void testQuery() throws SolrServerException, IOException{
CloudSolrClient client = new CloudSolrClient("192.168.126.131:2181,192.168.126.131:2182,192.168.126.131:2183");
client.setDefaultCollection("collection1");
//可视化界面左侧条件
SolrQuery params = new SolrQuery();
//设置q
params.setQuery("id:*");
//设置分页
//从第几条开始查询,从0开始
params.setStart(0);
//查询几个
params.setRows(10);
//启动高亮
params.setHighlight(true);
//设置高亮列
params.addHighlightField("hhxy");
//设置前缀
params.setHighlightSimplePre("<span style='color:red;'>");
//设置后缀
params.setHighlightSimplePost("</span>");
//相当于点击查询按钮, 本质,向solr web服务器发送请求,并接收响应. query对象里面包含了返回json数据
QueryResponse response = client.query(params);
Map<String, Map<String, List<String>>> hh = response.getHighlighting();
//取出docs{}
SolrDocumentList solrList = response.getResults();
for (SolrDocument doc : solrList) {
System.out.println(doc.getFieldValue("id"));
System.out.println("未高亮:"+doc.getFieldValue("hhxy"));
Map<String, List<String>> map = hh.get(doc.getFieldValue("id"));
System.out.println(map);
//list可能为null
List<String> list = map.get("hhxy");
System.out.println(list);
if(list!=null&&list.size()>0){
System.out.println("高亮:"+list.get(0));
}else{
System.out.println("没有高亮内容");
}
System.out.println(doc.getFieldValue("hhxy"));
}
}
}