solr7.5的使用教程

版权声明:本文为博主原创文章,未经博主允许不得转载。你想转载请附加连接哦 https://blog.csdn.net/dmw412724/article/details/83755532

目录

1.下载

2.启动

3.tomcat呢?

4.汉语分词器

5.java使用


1.下载

https://lucene.apache.org/solr/mirrors-solr-latest-redir.html点击这里下载

下载完目录结构大约是这样

2.启动

怎么启动?

启动有两种方式,solr从5.0开始里面就内嵌了jetty的嵌入式服务器启动。当然你也可以放到tomcat里去启动。

进入bin文件夹里,然后右键在此处打开命令行。

这就启动了,默认端口是8983.我们打开localhost:8983

可以看到已经启动成功了.到了solr的后台管理界面了.

有页面有服务,那么它实际上jetty启动的项目是在这里solr-7.5.0\server\solr-webapp\webapp

这里面有个要注意的地方.

就是两个概念.也就是

solr_home和solr_core.

solr_home相当于tomcat的webapp.

solr_core相当于里面的一个项目.

无论是tomcat启动solr,还是jetty启动solr,都相当于启动加载了一个solr_home.至于里面有没有solr_core,有几个solr_core,那这要看你准备部署几个搜索项目.

那么jetty启动的时候默认的solr_home是在这里solr-7.5.0\server\solr

它默认是这样的

这里面这六个文件,只有solr.xml才是solr_home所必须的。将来你可以换个文件夹作为solr_home,其他的可能不需要,但是请把这个solr.xml给复制到里面。它是必须的。

其他的东西实际上是没什么卵用的。

 接下来我们在localhost:8983里创建下solr_core。

点击Add Core的意思是我要创建一个叫做new_core的solr_core。要注意的是第二行,意思是该核心solr_core所处的文件夹是%solr_home%/new_core 。但实际上我们那个目录里面是没有这个文件夹的。所以直接点击确定肯定会报错。

我们需要新建个new_core的文件夹。

solr_home的必须文件是solr.xml

solr_core也有必须品,那就是配置。

在solr-7.5.0\server\solr\configsets\_default里。我们直接把里面的conf文件夹复制到新建的new_core里面。

然后在网站上点击添加,这样就添加了。

然后到这里:

3.tomcat呢?

用tomcat来启动怎么启动?

1.在tomcat下新建个项目,直接把\solr-7.5.0\server\solr-webapp\webapp这里面的东西复制进去。

2.但还要注意:需要把solr-7.5.0\server\lib下面的以metrics开头的jar包,和solr-7.5.0\server\lib\ext下面的所有jar包放到项目里面。

3.修改web.xml,把这段给注释了.

 <!-- Get rid of error message 
  <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>-->

添加环境变量指向solr_home.你可以随便新建个文件夹把solr.xml给复制过来,就当是solr_home了

  <env-entry>
    <env-entry-name>solr/home</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>C:\\Users\\Administrator\\Desktop\\solrHome</env-entry-value>
  </env-entry>

这样才能启动成功。

4.汉语分词器

什么是搜索?

比如:“我喜欢唐老鸭”这句话存起来,为什么可以搜"唐老鸭"三个字就可以搜到“我喜欢唐老鸭”这句话?

搜索把句子拆成关键词语然后做成索引,则可以根据索引搜索到。

那么拆句怎么拆?这就需要分词器了.

然而我们处在中国,需要配置上汉语的分词器。

汉语的分词器叫做:IKAnalyzer

下载下来,解压后目录大约是这样的:

如果你要配置汉语的分词器,则需要做到下面三件事情:

1.把里面俩jar包,放到项目WEB-INF/lib里.

2.把剩下三个文件放到项目WEB-INF/classes下面(如果没有classes文件夹,新建即可)

3.添加分词器到核心配置文件里.配置文件是哪个?是这个

随便在里面找个地方添加以下内容:

<fieldType name="text_ik" class="solr.TextField">  
     <analyzer type="index" useSmart="false"
         class="org.wltea.analyzer.lucene.IKAnalyzer" />
     <analyzer type="query" useSmart="true"
         class="org.wltea.analyzer.lucene.IKAnalyzer" />
 </fieldType> 

这个文件里面的一些属性是什么意思?请参考我的另外一篇博客:点击这里,你最好先看完这个

那么现在汉语分词器就安装好了.可以重新启动起来. 

5.java使用

我们假设一个需求:

现在把商品存到搜索服务器里.

商品goods有几个属性:

goodsid ID
goodstitle 商品标题
goodspics 商品图片
createTime 创建时间

搜索包含关键字的商品标题的所在商品.且是按创建时间倒查.

首先需要在managed-schema配置以下几个属性

    <field name="goodsid" type="string"  stored="true" required="true" multiValued="false" /> 
	<field name="goodstitle" type="text_ik" indexed="true" required="true" stored="true" multiValued="false"/>
	<field name="goodspics" type="string"  stored="true" required="true" multiValued="false"/>
	<field name="createTime" type="plong"  stored="true" required="true" multiValued="false"/>

记得这个配置文件默认的是"id".找到下面这个标签,替换成goodsid

<uniqueKey>goodsid</uniqueKey>

 然后在项目里面maven引入文件

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

接下来我直接粘贴一个工具类吧.里面都有注释.

package com.bai.solrs;

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.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
/*
 * 
	<field name="goodsid" type="string"  stored="true" required="true" multiValued="false" /> 
	<field name="goodstitle" type="text_ik" indexed="true" stored="true" multiValued="false"/>
	<field name="goodspics" type="string"  stored="true" multiValued="false"/>
	<field name="createTime" type="plong"  stored="true" multiValued="false"/>
	
	<fieldType name="text_ik" class="solr.TextField">  
     <analyzer type="index" useSmart="false"
         class="org.wltea.analyzer.lucene.IKAnalyzer" />
     <analyzer type="query" useSmart="true"
         class="org.wltea.analyzer.lucene.IKAnalyzer" />
 	</fieldType>
 	
 	 <!--记得这个id覆盖掉-->
 	 <!--<uniqueKey>goodsid</uniqueKey>-->
 */
/**
 * 模拟商品数据的存取。
 * 商品有四个属性。分别是goodsid 主键id,goodstitle 商品标题,goodspics 商品图片,createTime 创建时间
 * @author dmw
 *
 * 2018年11月6日
 */
public class SolrUtil  {
	/**
	 * solr7+的客户端连接器
	 */
	private static HttpSolrClient client;
	/**
	 * solr服务端核心的url
	 */
	private static String baseUrl = "http://localhost:8080/solr/new_core";
	/**
	 * 是否数据批量刷入Solr.
	 * 如果为false,代表着单个刷入,即每新增一个数据便立即刷入
	 * 如果为true,代表着先把数据放入集合里,直到集合的长度为max_pool_size时,再统一批量刷入solr
	 */
	private static boolean collectCommite = false;
	/**
	 * 集合的最大长度
	 */
	private static int max_pool_size = 10;
	/**
	 * 数据集合
	 */
	private static List<SolrInputDocument> pool = new ArrayList<SolrInputDocument>();
	
	
	
	static{
		client = new HttpSolrClient.Builder(baseUrl)
				.withConnectionTimeout(3000)
				.withSocketTimeout(5000)
				.build();
	}
	
	
	/**
	 * 添加
	 * 
	 * @param goodsid
	 * @param goodstitle
	 * @param goodspics
	 * @throws SolrServerException
	 * @throws IOException
	 */
	public static void add(String goodsid,String goodstitle,String goodspics) throws SolrServerException, IOException{
		/**
		 * 创建一个元素,添加四个属性
		 */
		SolrInputDocument document = new SolrInputDocument();
		document.addField("goodsid", goodsid);
		document.addField("goodstitle", goodstitle);
		document.addField("goodspics", goodspics);
		document.addField("createTime", System.currentTimeMillis());
		
		if (collectCommite){
			/**
			 * 放入池子里.如果池子长度等于或超出设定长度,批量刷入
			 */
			synchronized ("ok") {
				pool.add(document);
				if (pool.size() >= max_pool_size){
					client.add(pool);
					client.commit();
					pool.clear();
				}
				
			}
		}else {
			/**
			 * 来一个刷一个
			 */
			client.add(document);
			client.commit();
		}
		
	}
	/**
	 * 搜索
	 * 
	 * @param title
	 * @param page
	 * @param rows
	 * @return
	 * @throws SolrServerException
	 * @throws IOException
	 */
	public static SolrDocumentList get(String keyword,int page,int rows) throws SolrServerException, IOException{
		/**
		 * 本例条件是:
		 * 1.商品标题带有某个关键字的
		 * 2.分页查询 page是页,rows是每页几个
		 * 3.按创建时间倒查
		 */
		SolrQuery query = new SolrQuery("goodstitle:"+keyword);
		query.setStart((page-1)*rows);
		query.setRows(rows);
		query.setSort("createTime", SolrQuery.ORDER.desc);
		QueryResponse response = client.query(query);
		SolrDocumentList results = response.getResults();
		return results;
	}
	/**
	 * 删除
	 * @param goodsid
	 * @throws SolrServerException
	 * @throws IOException
	 */
	public static void delete(String goodsid) throws SolrServerException, IOException{
		client.deleteById(goodsid);
		client.commit();
	}
	
	public static void main(String[] args) throws SolrServerException, IOException {
		/**
		 * 搜索的测试
		SolrDocumentList list = get("米老",1,10);
		System.out.println(JSONArray.fromObject(list).toString());*/
		
		
		
		/*
		 * 添加的测试*/
		
		/* add(UUID.randomUUID().toString(), "我喜欢米老鼠", "1.jpg");*/
		/*add(UUID.randomUUID().toString(), "黑皮西瓜", "1.jpg");
		add(UUID.randomUUID().toString(), "南方大西瓜", "1.jpg");*/
		
	}
}

猜你喜欢

转载自blog.csdn.net/dmw412724/article/details/83755532