目录
1.下载
2.启动
3.tomcat呢?
4.汉语分词器
5.java使用
https://lucene.apache.org/solr/mirrors-solr-latest-redir.html点击这里下载
下载完目录结构大约是这样
怎么启动?
启动有两种方式,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里面。
然后在网站上点击添加,这样就添加了。
然后到这里:
用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/home
java.lang.String
C:\\Users\\Administrator\\Desktop\\solrHome
这样才能启动成功。
什么是搜索?
比如:“我喜欢唐老鸭”这句话存起来,为什么可以搜"唐老鸭"三个字就可以搜到“我喜欢唐老鸭”这句话?
搜索把句子拆成关键词语然后做成索引,则可以根据索引搜索到。
那么拆句怎么拆?这就需要分词器了.
然而我们处在中国,需要配置上汉语的分词器。
汉语的分词器叫做:IKAnalyzer,下载地址:https://download.csdn.net/download/dmw412724/12035637
下载下来,解压后目录大约是这样的:
如果你要配置汉语的分词器,则需要做到下面三件事情:
1.把里面俩jar包,放到项目WEB-INF/lib里.
2.把剩下三个文件放到项目WEB-INF/classes下面(如果没有classes文件夹,新建即可)
3.添加分词器到核心配置文件里.配置文件是哪个?是这个
随便在里面找个地方添加以下内容:
这个文件里面的一些属性是什么意思?请参考我的另外一篇博客:点击这里,你最好先看完这个
那么现在汉语分词器就安装好了.可以重新启动起来.
我们假设一个需求:
现在把商品存到搜索服务器里.
商品goods有几个属性:
goodsid | ID |
goodstitle | 商品标题 |
goodspics | 商品图片 |
createTime | 创建时间 |
搜索包含关键字的商品标题的所在商品.且是按创建时间倒查.
首先需要在managed-schema配置以下几个属性
记得这个配置文件默认的是"id".找到下面这个标签,替换成goodsid
goodsid
然后在项目里面maven引入文件
org.apache.solr
solr-solrj
7.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");*/
}
}