下载地址 http://www.apache.org/dyn/closer.lua/lucene/solr/8.0.0
windows下载zip,linux下载tgz
下载完解压
2.solr启动&停止solr-8.0.0\bin目录下执行cmd
solr start 启动
solr stop -all
3.创建solrcore
\solr-8.0.0\server\solr\目录下新建文件夹(如:new_db)
将example\example-DIH\solr\db下的文件 copy到/new_core下
将数据库驱动(mysql-cnnector-java-5.1.47.jar) 和dist文件夹里的solr-dataimporthandler-8.0.0.jar
拷贝到\solr-8.0.0\server\solr-webapp\webapp\WEB-INF\lib\下
打开new_core下的conf目录在db-data-config.xml、managed-schema中进行配置以下是我的例子
db-data-config.xml
:
'${dataimporter.last_index_time}'">
managed-schema
:
配置了我查出的字段
indexed 是否索引:
索引的的目的是为了搜索.
需要搜索的域就一定要创建索引,只有创建了索引才能被搜索出来
不需要搜索的域可以不创建索引
需要索引: 文件名称, 文件内容, id, 身份证号等
不需要索引: 比如图片地址不需要创建索引, e:\xxx.jpg,因为根据图片地址搜索无意义
stored 是否存储:
存储的目的是为了显示.
是否存储看个人需要,存储就是将内容放入Document文档对象中保存出来,会额外占用磁盘空间, 如果搜索的时候需要马上显示出来可以放入document中也就是要存储,这样查询显示速度快, 如果不是马上立刻需要显示出来,则不需要存储,因为额外占用磁盘空间不划算.
ik分词器的配置
下载地址:https://search.maven.org/search?q=com.github.magese
将下载好的jar包放入solr-7.4.0/server/solr-webapp/webapp/WEB-INF/lib目录中
然后再解压一份jar包,将里面的5个配置文件放入D:\study\solr-8.0.0\server\solr-webapp\webapp\WEB-INF\classes目录下(如果无classes新建一个)
IKAnalyzer.cfg.xml、 ext.dic、 stopword.dic、 ik.conf、 dynamicdic.txt
ext.dic中可以自定义你的分词,比如我在里面输入了"希没"两个毫无关联不会被分成词语的字,在查询"有冠希没关系" ,"希没"就会被分成一个词
在managed-schema中加入以下代码
提示:报错请查看客户端页面的Logging (localhost:8983) 或者\solr-8.0.0\server\logs\查看更详细的日志
在客户端测试下看可不可以查出来
4.编写Java代码引入对应版本的solrJ依赖
org.apache.solr
solr-solrj
8.0.0
solr初始化
//solr连接url
public static final String solrUrl = "http://localhost:8983/solr/bilibili_db/";
//创建Solr的客户端连接对象
SolrClient solrServer = new HttpSolrClient.Builder(solrUrl).build();
//创建一个索引文档
SolrInputDocument sd = new SolrInputDocument();
下面是我的查询方法
public static SolrDocumentList search(SolrQueryUtil q) throws IOException, SolrServerException {
//定义url
String solrUrl = "http://localhost:8983/solr/"+q.getCoreName();
//创建Solr的客户端连接对象
HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl).build();
//创建查询对象
SolrQuery query = new SolrQuery();
//q查询条件
query.set("q",q.getQuery());
//根据id排序
query.setSort(q.getSort(),SolrQuery.ORDER.asc);
query.setStart(q.getStart());
query.setRows(q.getRows());
//查询响应对象
QueryResponse response = solrClient.query(query);
//获取查询结果列表
SolrDocumentList docs = response.getResults();
//获取查询出的数量
long count = docs.getNumFound();
/*遍历结果列表
for (SolrDocument doc : docs) {
System.out.println("id:"+doc.get("id")+",title:"+doc.get("title")+"up:"+doc.get("up"));
}*/
//关闭客户端
solrClient.close();
return docs;
}
controller中调用
@RequestMapping("searchvideos")
public Dto searchVideo(Video v){
//传入coreName 查询条件(name:"" 支持or或者and及模糊查询**)
SolrQueryUtil query = new SolrQueryUtil("bilibili_db",
"title:*"+v.getTitle()+"* or up:*"+v.getUp()+"*","id",0,5);
SolrDocumentList docs = null;
try {
docs = SolrService.search(query);
} catch (IOException | SolrServerException e) {
e.printStackTrace();
return DtoUtil.returnFail("系统异常,获取失败","searchError");
}
return DtoUtil.returnDataSuccess(docs);
}