Solr使用
Posted 喔易
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Solr使用相关的知识,希望对你有一定的参考价值。
一、安装(win)
1、下载安装包
https://mirror.bit.edu.cn/apache/lucene/solr/ https://mirrors.bfsu.edu.cn/apache/lucene/solr/ https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/solr/
解压压缩包,进入bin目录,执行启动命令。
启动命令:solr start
关闭命令:solr stop -all
重启solr :solr restart –p p_num(默认端口号8983)
2、基本配置
a、创建核心文件夹(可以理解为数据库)
进入E:\demo\solr-8.5.2\solr-8.5.2\server\solr目录,创建my_db目录
b、将E:\demo\solr-8.5.2\solr-8.5.2\server\solr\configsets\sample_techproducts_configs目录下conf目录复制到my_db目录下。
c、创建核心
浏览器访问 http://localhost:8983/solr
选择 Core Admin
右侧输入框的 name 和 InstanceDir 输入my_db
将下载好的jar包放入E:\demo\solr-8.5.2\solr-8.5.2\server\solr-webapp\webapp\WEB-INF\lib 目录中(lib、classes目录不存在可以自己创建)
2)将resources目录下的5个配置文件放入webapp/WEB-INF/classes/目录下
① IKAnalyzer.cfg.xml
② ext.dic
③ stopword.dic
④ ik.conf
⑤ dynamicdic.txt
3)配置Solr的managed-schema,添加ik分词器:
<!-- ik分词器 -->
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
4)重启solr,可以看到:
4、从mysql导入数据
1)将mysql-connector-java-xx.xx.xx.jar驱动包放到E:\demo\solr-8.5.2\solr-8.5.2\dist目录下
打开E:\demo\solr-8.5.2\solr-8.5.2\server\solr\my_db\conf2) solrconfig.xml文件修改添加
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-.*\.jar" />
<lib dir="${solr.install.dir:../../../..}/dist/" regex="mysql-connector-java-.*\.jar" />
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">db-data-config.xml</str>
</lst>
</requestHandler>
这里的name:/dataimport如果已经在其他core使用定义过,换个名称就可以了。
3) db-data-config.xml不存在可以自己创建,添加如下内容(字段根据自己需要设置)
<dataConfig>
<dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/xmall?serverTimezone=UTC" user="root" password="" />
<document>
<!-- document实体 -->
<entity name="goods" query="SELECT * FROM xmall_goods">
<!-- 数据库字段映射solr字段 -->
<field column="goods_id" name="goodsId"/>
<field column="goods_brief" name="goodsBrief"/>
<field column="goods_name" name="goodsName"/>
<field column="goods_sn" name="goodsSn"/>
<field column="goods_update_time" name="goodsUpdateTime"/>
<field column="goods_detail" name="goodsDetail"/>
</entity>
</document>
</dataConfig>
4) managed-schema修改 ,添加自定义域
<!--自定义的域-->
<field name="goodsId" type="string" indexed="true" stored="true"/>
<field name="goodsBrief" type="string" indexed="true" stored="true" />
<field name="goodsName" type="text_ik" indexed="true" stored="true" />
<field name="goodsSn" type="string" indexed="true" stored="true" />
<field name="goods_detail" type="text_ik" indexed="true" stored="true" />
<field name="goodsUpdateTime" type="pdate" indexed="true" stored="true" />
<!--自定义的域 end-->
5)重启solr solr restart -p 8983 执行导入(需要手动刷新状态)
6)查询
5、实现实时重建索引和增量更新
参考:https://blog.csdn.net/xiatiandexiangrikui/article/details/80263544
二、springboot集成
1)添加依赖
<!-- 添加solr依赖 -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
</dependency>
2)Application.yml配置
spring:
data:
solr:
host: http://127.0.0.1:8983/solr/meta_db
3)简单代码示例
@RestController
public class SolrController {
@Autowired
SolrClient solrClient;
@RequestMapping("/solr/add")
@ResponseBody
public Object Test() throws Exception {
List<SolrInputDocument> docs = new ArrayList<>();
SolrInputDocument doc = new SolrInputDocument();
/**
* 添加字段索引,id一样,为修改,id不一样,为新增
*/
doc.setField("id", "1");
/**
* 商品类目
*/
doc.setField("md_name", "床上四件套1");
/**
* 商品名称
*/
doc.setField("md_code", "cssjt1");
docs.add(doc);
doc = new SolrInputDocument();
doc.setField("id", "2");
doc.setField("md_name", "床上四件套2");
doc.setField("md_code", "cssjt2");
docs.add(doc);
doc = new SolrInputDocument();
doc.setField("id", "3");
doc.setField("md_name", "床上四件套3");
doc.setField("md_code", "cssjt3");
docs.add(doc);
doc = new SolrInputDocument();
doc.setField("id", "3");
doc.setField("md_name", "文具办公类");
doc.setField("md_code", "钢笔");
docs.add(doc);
/**
* 一次性全部添加
*/
solrClient.add(docs);
/**
* 提交
*/
solrClient.commit();
return ResponseUtil.ok();
}
@RequestMapping("/solr/query")
public Object Query() throws Exception {
SolrQuery solrQuery = new SolrQuery();
/**
* *:*:表示查询全部 *Mac*代表左右模糊匹配,如果写Mac代表绝对匹配
*/
solrQuery.set("q", "md_name:床上四件套*");
/**
* 过滤条件:电脑办公类,10000元以上 [A TO B] 范围A到B之间 [A TO *] A到无穷 [* TO B] B以下
* 相当于sql语句中的where ----->fq = filter query
*/
// solrQuery.set("fq", "md_name:床上四件套");
// solrQuery.set("fq", "md_code:hello");
// 分页,0开始,每页5条,setStart设置的就是显示第几页
solrQuery.setStart(0);
solrQuery.setRows(5);
// 开启高亮
solrQuery.setHighlight(true);
// 添加高亮字段,多个字段之间逗号隔开比如: A,B,C
solrQuery.addHighlightField("md_name,md_code");
// 设置高亮字段的前缀
solrQuery.setHighlightSimplePre("<font color='red'>");
// 设置高亮字段的后缀
solrQuery.setHighlightSimplePost("</font>");
// 执行查询
QueryResponse response = solrClient.query(solrQuery);
// 文档结果集
SolrDocumentList docs = response.getResults();
System.err.println("-------------------高亮效果部分展示-------------------------");
// 高亮显示的返回结果
Map<String, Map<String, List<String>>> maplist = response.getHighlighting();
/**
* 静态html资源里面的对象 -- ${list}
*/
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> m;
// 返回高亮之后的结果..
for (SolrDocument solrDocument : docs) {
String id = solrDocument.getFirstValue("id").toString();
String md_name = solrDocument.getFirstValue("md_name").toString();
String md_code = solrDocument.getFirstValue("md_code").toString();
m = new HashMap<String, Object>();
m.put("id", id);
m.put("md_name", md_name);
m.put("md_code", md_code);
list.add(m);
System.err.println(md_name);
System.err.println(md_code);
System.err.println("============分割线==============");
}
System.err.println("查询到的总条数:" + docs.getNumFound() + ", 内容:" + docs);
return ResponseUtil.okList(list);
}
@RequestMapping("/solr/deleteall")
@ResponseBody
public Object DeleteAll() throws Exception {
// 清空所有数据
solrClient.deleteByQuery("*:*");
solrClient.commit();
return ResponseUtil.ok();
}
以上是关于Solr使用的主要内容,如果未能解决你的问题,请参考以下文章