solr的搭建和使用--Day6

一:Solr的搭建

1:下载

http://archive.apache.org/dist/lucene/solr/

2:安装步骤

2.1:先安装Tomcat

https://blog.csdn.net/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.csdn.net/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"));
		}
		
	}
	
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值