一、安裝(win)
1、下載安裝包
官網地址:https://www.apache.org/dyn/closer.lua/lucene/solr/
點擊任意下載地址:
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)
管理頁面地址:http://localhost:8983/solr/
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
3、配置中文分詞器 IK-Analyzer-Solr8
1)先下載solr8版本的ik分詞器jar,下載地址:https://search.maven.org/search?q=com.github.magese
分詞器GitHub源碼地址:https://github.com/magese/ik-analyzer-solr
將下載好的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\conf
2) 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集成
- 添加依賴
<!-- 添加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();
}
歡迎關注微信公衆號,留言建議。