Solr简介Solr使用及SolrCloud搭建

一、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"));
		}
		
	}
	
}

 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值