目录
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,把这段给注释了.
添加环境变量指向solr_home.你可以随便新建个文件夹把solr.xml给复制过来,就当是solr_home了
solr/homejava.lang.StringC:\\Users\\Administrator\\Desktop\\solrHome
这样才能启动成功。
4.汉语分词器
什么是搜索?
比如:“我喜欢唐老鸭”这句话存起来,为什么可以搜"唐老鸭"三个字就可以搜到“我喜欢唐老鸭”这句话?
搜索把句子拆成关键词语然后做成索引,则可以根据索引搜索到。
那么拆句怎么拆?这就需要分词器了.
然而我们处在中国,需要配置上汉语的分词器。
汉语的分词器叫做:IKAnalyzer,下载地址:https://download.csdn.net/download/dmw412724/12035637
下载下来,解压后目录大约是这样的:
如果你要配置汉语的分词器,则需要做到下面三件事情:
1.把里面俩jar包,放到项目WEB-INF/lib里.
2.把剩下三个文件放到项目WEB-INF/classes下面(如果没有classes文件夹,新建即可)
3.添加分词器到核心配置文件里.配置文件是哪个?是这个
随便在里面找个地方添加以下内容:
这个文件里面的一些属性是什么意思?请参考我的另外一篇博客:点击这里,你最好先看完这个
那么现在汉语分词器就安装好了.可以重新启动起来.
5.java使用
我们假设一个需求:
现在把商品存到搜索服务器里.
商品goods有几个属性:
goodsid | ID |
goodstitle | 商品标题 |
goodspics | 商品图片 |
createTime | 创建时间 |
搜索包含关键字的商品标题的所在商品.且是按创建时间倒查.
首先需要在managed-schema配置以下几个属性
记得这个配置文件默认的是"id".找到下面这个标签,替换成goodsid
goodsid
然后在项目里面maven引入文件
org.apache.solrsolr-solrj7.5.0
接下来我直接粘贴一个工具类吧.里面都有注释.
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;
/** */
/*** 模拟商品数据的存取。* 商品有四个属性。分别是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 pool = new ArrayList();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");*/}
}