一、Solr简介
1、Solr是什么?
1.1就是一个war项目
2、自己的项目如何Solr进行交互?
2.1特定的API叫做SolrJ(底层其实就是HttpClient)
3、具备数据持久化功能
3.1Solr中会存储需要进行搜索的数据
3.2把所有的数据都初始化到Solr中.
4、Solr作用(什么时候使用Solr)
4.1大量数据检索时使用Solr,能提升检索效率.
5、Solr是基于索引进行查询的.
5.1顺序查询:从内容的最开始找到内容为止
5.2反向键索引:
5.2.1把内容中进行拆分.
6、国内实现检索的常用方案.
6.1Apache Lucene:实现检索的解决方案(Solr就是基于Lucene)
6.2Baidu API:
6.3Google API:
Solr单机版搭建
步骤很简单在这里就不在详细介绍了,把下载好的solr部署在tomcat底下,启动tomcat就可以看到可视化管理页面了(应为它是个web项目,有个页面很正常)
二、IK Analyzer中文拆词器
1、Solr默认对中文拆词功能支持不好.
1.1解决方案:使用IK Analyzer拆词器
2、配置IK Analyzer时本质实际上是给Solr新建了一个fieldType,只要某个属性(field)是这个类型,这个属性就会使用IK Analyzer进行拆词
2.1配置fieldType。需要在solrhome/collection/conf/schema.xml中配置.。添加一个fieldType(这里为止不受限制的一般和其它放一块就可以了
<fieldType name="text_ik" class="solr.TestField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
//完之后自己定义一个属性
<field name="name" type="text_ik" indexed="true" stored="true"/>
完之后保存测试看一下,我们看到以下结果
三、Solr管理界面的Documents菜单功能
1、包含了solr数据的新增、删除、修改三个功能
2、数据支持很多种格式:json或xml等
3、新增时,必须要包含对id的新增
4、每次新增,Solr会新建一个SolrDocument对象,这个对象存储新增内容
4.1把SolrDocument理解成实体类
4.2包含了Solr的schema.xml中配置的所有field
4.3新增时有什么属性,最终显示时就有什么属性
5、把DocumentType以xml方式举例
5.1新增
<doc>
<field name="id">change.me</field>
<field name="title">change.me</field>
</doc>
5.2修改:只要id已经存在执行修改(根据id覆盖)
5.3删除:
删除全部
<delete>
<query>*:*</query>
</delete>
单个删除
<delete>
<id>id</id>
</delete>
<commit/>
四、管理界面quey菜单功能(查询)
1、q:表示查询条件
1.1*:*查询全部
1.2字段:值。把值按照对应的分词器拆分查询
1.3字段:“值”。带双引号的不会拆词查询
1.4在schema.xml中配置复合属性,这个复合属性可以包含多个其他属性的值
1.4.1在schema.xml添加下面内容
<field name="personclass" type="text_ik" indexed="true" stored="true" multiValued="true"/>
//zhansan lisi有的personclass也有
<copyField source="zhansan" dest="personclass"/>
<copyField source="lisi" dest="personclass"/>
2、fq :再加一个条件,就是并列条件
3、sort: 排序 字段 asc 或者 字段 desc
4、start rows :分页,查询限制条数,默认十条
5、fl:只显示那些属性的值
6、df :default field默认的查询字段,一般默认指定。
7、wt:返回结果格式
还有高亮功能一些等等,就不一一说了,完之后对应这些功能的代码如下:
package com.bjsxt;
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.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
*/
public void testInsert() throws SolrServerException, IOException{
SolrClient client = new HttpSolrClient("http://192.168.249.131:8080/solr/");
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "005");
// doc.addField("bjsxt", "java和大数据培训");
doc.addField("bjsxt1", "大数据4");
client.add(doc);
client.commit();
}
public void testDelete() throws SolrServerException, IOException{
SolrClient client = new HttpSolrClient("http://192.168.249.131:8080/solr/");
client.deleteById("001");
client.commit();
}
@Test
public void testQuery() throws SolrServerException, IOException{
SolrClient client = new HttpSolrClient("http://192.168.249.131:8080/solr/");
//可视化界面左侧条件
SolrQuery params = new SolrQuery();
//设置q
params.setQuery("bjsxtall:*");
//设置分页
//从第几条开始查询,从0开始
params.setStart(0);
//查询几个
params.setRows(10);
//启动高亮
params.setHighlight(true);
//设置高亮列
params.addHighlightField("bjsxt");
//设置前缀
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("bjsxt"));
Map<String, List<String>> map = hh.get(doc.getFieldValue("id"));
System.out.println(map);
//list可能为null
List<String> list = map.get("bjsxt");
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("bjsxt1"));
}
}
}
五、SolrCloud
1、Solr是一个web项目,需要放入tomcat里,依赖多个tomcat,让多个tomcat之间能够通信。
2、 需要借助 zookeeper 实现 tomcat 直接通信
3.、结构图
使用zookeeper可以进行管理solr集群,以下zk安装教程
1、上传压缩包到/usr/local/tmp下,并解压.
2、在/usr/local下新建文件夹zookeeper
# mkdir /usr/local/zookeeper
3、把解压的所文件夹复制到zookeeper下,并命名为zk1
# cp -r /usr/local/temp/zookeeper-3.4.8 /usr/local/zookeeper/zk1
4、在zk1下新建文件夹data
5、在data下新建文件myid,里面写上1
# vim myid
6、进入到zk1/conf下把zoo_sample.cfg复制一份叫做zoo.cfg
7、编辑zoo.cfg内容,设置dataDIR为data文件夹,并在文件最下面添加下面内容
server.1=192.168.213.130:2688:3888
server.2=192.168.213.130:2689:3889
server.3=192.168.213.130:2690:3890
7.1 server.1 中的1 是myid的内容
7.2 2688,2689,2690 是zookeeper内部端口
7.3 3888,3889,3890 是leader端口
8、把zk1复制两份,分别叫做zk2,zk3,并修改myid的值为2,3 修改zoo.cfg中dataDIR和clientPort
9、启动三个zookeeper
# ./zkServer.sh start
10、查看状态
# ./zkServer.sh status
Solrcloud安装部署
注:前提是已经安装完zookeeper
1、复制/usr/local/solr/tomcat,在复制3份,分别叫做tomcat2,tomcat3,tomcat4
2、修改tomcat/conf/server.xml的端口号,每个文件都需要修改3处.
3、复制/usr/local/solr/solrhome再复制3份,分别叫做solrhome2,solrhome3,solrhome4
4、修改tomcat中solr项目的web.xml中<env-entity-value>为对应的solrhome路径
5、修改4个tomcat的tomcat/bin/startup.sh,在最上面加上,否则启动时都启动一个
export CATALINA_HOME=/usr/local/solr/tomcat3
export CATALINA_BASE=/usr/local/solr/tomcat3
6、在第一个tomcat的tomcat/bin/catalina.sh的最上面添加
JAVA_OPTS="$JAVA_OPTS -DzkHost=192.168.213.130:2181,192.168.213.130:2182,192.168.213.130:2183 -Dbootstrap_confdir=/usr/local/solr/solrhome/collection1/conf -Dcollection.configName=collection1 -DnumShards=2 -DreplicationFactory=2"
-DzkHost表示zookeeper地址
-Dbootstrap_confdir表示对某个solr实例下的配置统一管理
-Dcollection.configName表示配置文件别名,一般与实例名称相同。
-DnumShards表示分片数量
-DreplicationFactor表示每个分片中服务数量(2表示一主一备)
7、在另外3个tomcat/bin/catalina.sh最上面添加
JAVA_OPTS="$JAVA_OPTS -DzkHost=192.168.213.130:2181,192.168.213.130:2182,192.168.213.130:2183 -DnumShards=2 -DreplicationFactory=2"
8、修改4个solrhome的solrhome下的solr.xml
9、关闭防火墙
10、启动tomcat
11、观察结果,出现了cloud项,成功页面如下
下面是对SolrCloud操作的代码
package com.bjsxt;
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.249.131:2181,192.168.249.131:2182,192.168.249.131:2183");
client.setDefaultCollection("collection1");
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "005");
// doc.addField("bjsxt", "java和大数据培训");
doc.addField("bjsxt1", "大数据4");
client.add(doc);
client.commit();
}
public void testDelete() throws SolrServerException, IOException{
CloudSolrClient client = new CloudSolrClient("192.168.249.131:2181,192.168.249.131:2182,192.168.249.131:2183");
client.setDefaultCollection("collection1");
client.deleteById("001");
client.commit();
}
public void testQuery() throws SolrServerException, IOException{
CloudSolrClient client = new CloudSolrClient("192.168.249.131:2181,192.168.249.131:2182,192.168.249.131:2183");
client.setDefaultCollection("collection1");
//可视化界面左侧条件
SolrQuery params = new SolrQuery();
//设置q
params.setQuery("bjsxtall:*");
//设置分页
//从第几条开始查询,从0开始
params.setStart(0);
//查询几个
params.setRows(10);
//启动高亮
params.setHighlight(true);
//设置高亮列
params.addHighlightField("bjsxt");
//设置前缀
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("bjsxt"));
Map<String, List<String>> map = hh.get(doc.getFieldValue("id"));
System.out.println(map);
//list可能为null
List<String> list = map.get("bjsxt");
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("bjsxt1"));
}
}
}