一、準備環境
1、一臺linux服務器(Centos7)
2、安裝jdk8環境
3、準備solr7.8安裝包
二、安裝(我這裏使用的是solr自帶的應用容器,也可以集成到tomcat)
1)從官網下載最新solr
wget http://mirrors.shuosc.org/apache/lucene/solr/7.4.0/solr-7.4.0.tgz
2)解壓,安裝
tar -zxvf solr-7.2.0.tgz
3)相關命令
bin/solr stop -all 關閉solr服務
bin/solr start -force 開啓solr服務
bin/solr status 查看solr服務狀態
三、使用solr
1、點擊Core Admin
2、按照步驟去創建,然後點擊確認會出現
3、這個錯誤是因爲找不到對應的配置文件,進入server/solr/configsets/_default/直接把裏面的conf 複製到 你新建的core中 你新建的core在server/solr目錄下
命令如下:
1、進入到server/solr/configsets/_default下
cd /usr/local/install/solr7.4.0/server/solr/configsets/_default/
2、然後複製到新建的test中
cp -r conf /usr/local/install/solr7.4.0/server/solr/test/
3、到這兒core已創建好,相應的操作可以去網上尋找,我在這就不詳細說明
三、連接mysql數據庫
1)首先處理jar
mysql-connector-java-x.x.x.jar solr-dataimporthandler-extras-5.1.0.jar solr-dataimporthandler-7.1.0.jar
拷貝到 solr\server\solr-webapp\webapp\WEB-INF\lib 下
1)配置連接信息
找到你新建的 core 下的solrconfig.xml文件(solrconfig.xml 文件所在目錄是: solr\server\solr\test\conf),打開找到第一個requestHandler,在他下面加入如下內容
<requestHandler name="/dataimport"
class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
再在你創建的core目錄的conf下創建data-config.xml文件,內容如下
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.1.105:3306/solr"
user="root"
password="root" />
<document>
<entity name="person" query="select * from user">
<field column="ID" name="id" />
<field column="name" name="name" />
<field column="passward" name="passward" />
</entity>
</document>
</dataConfig>
dataSource不多說,一看就明白,
entity --代表數據庫表,column--代表數據庫表字段,name--代表solr中字段名
(注意:創建這個文件的時候第一行不能有空格或者空行,否則報錯)
在managed-schema文件中添加對應於數據庫字段的field,建議在 solr 可視化界面操作。當然,一定要手動修改 managed-schema 文件也不是不可以,但是每次更改完需要重新加載 Core,或者粗暴一點直接重新啓動solr也可以。那麼,直接修改 managed-schema 文件的。到這裏你應該能聯繫上數據庫了,也可以導入數據了。
三、在java中的應用
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>5.3.1</version>
</dependency>
一個測試小例子:package com.hzl.admin.api.test;
import com.hzl.admin.core.entity.User;
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.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import java.io.IOException;
import java.util.List;
public class SolrTest {
//指定solr服務器的地址
private final static String SOLR_URL = "http://192.168.1.253:8983/solr/";
/**
* 創建SolrServer對象
* <p>
* 該對象有兩個可以使用,都是線程安全的
* 1、CommonsHttpSolrServer:啓動web服務器使用的,通過http請求的
* 2、 EmbeddedSolrServer:內嵌式的,導入solr的jar包就可以使用了
* 3、solr 4.0之後好像添加了不少東西,其中CommonsHttpSolrServer這個類改名爲HttpSolrClient
*
* @return
*/
public HttpSolrClient createSolrServer() {
HttpSolrClient solr = null;
solr = new HttpSolrClient(SOLR_URL);
return solr;
}
/**
* 往索引庫添加文檔
*
* @throws IOException
* @throws SolrServerException
*/
public void addDoc() throws SolrServerException, IOException {
//構造一篇文檔
SolrInputDocument document = new SolrInputDocument();
//往doc中添加字段,在客戶端這邊添加的字段必須在服務端中有過定義
document.addField("id", "8");
document.addField("name", "周新星");
document.addField("password", "646456");
//獲得一個solr服務端的請求,去提交 ,選擇具體的某一個solr core
HttpSolrClient solr = new HttpSolrClient(SOLR_URL + "test");
solr.add(document);
solr.commit();
solr.close();
}
/**
* 根據id從索引庫刪除文檔
*/
public void deleteDocumentById() throws Exception {
//選擇具體的某一個solr core
HttpSolrClient server = new HttpSolrClient(SOLR_URL + "test");
//刪除文檔
server.deleteById("1");
//刪除所有的索引
//solr.deleteByQuery("*:*");
//提交修改
server.commit();
server.close();
}
/**
* 查詢
*
* @throws Exception
*/
public void querySolr() throws Exception {
HttpSolrClient solrServer = new HttpSolrClient(SOLR_URL + "test/");
SolrQuery query = new SolrQuery();
// 下面設置solr查詢參數
// 參數q 查詢所有
// query.set("q", "*:*");
// 相關查詢,比如某條數據某個字段含有周、星、馳三個字 將會查詢出來 ,這個作用適用於聯想查詢
query.set("q", "name:ha~ OR password:ha~");
// 參數fq, 給query增加過濾查詢條件
// id爲0-4
query.addFilterQuery("id:[32 TO 65]");
// 給query增加布爾過濾條件
// query.addFilterQuery("description:演員"); // description字段中含有“演員”兩字的數據
// 參數df,給query設置默認搜索域
query.set("df", "name");
// 參數sort,設置返回結果的排序規則
query.setSort("id", SolrQuery.ORDER.desc);
// 設置分頁參數
query.setStart(0);
// 每一頁多少值
query.setRows(10);
// 參數hl,設置高亮
query.setHighlight(true);
// 設置高亮的字段
query.addHighlightField("name");
// 設置高亮的樣式
query.setHighlightSimplePre("<font color='red'>");
query.setHighlightSimplePost("</font>");
// 獲取查詢結果
QueryResponse response = solrServer.query(query);
// 兩種結果獲取:得到文檔集合或者實體對象
// 查詢得到文檔的集合
SolrDocumentList solrDocumentList = response.getResults();
System.out.println("通過文檔集合獲取查詢的結果");
System.out.println("查詢結果的總數量:" + solrDocumentList.getNumFound());
// 遍歷列表
for (SolrDocument doc : solrDocumentList) {
System.out.println("id:" + doc.get("id") + " name:" + doc.get("name") + " password:" + doc.get("password"));
}
// 得到實體對象
List<User> tmpLists = response.getBeans(User.class);
if (tmpLists != null && tmpLists.size() > 0) {
System.out.println("通過文檔集合獲取查詢的結果");
for (User per : tmpLists) {
System.out.println("id:" + per.getId() + " name:" + per.getUserName() + " password:" + per.getPassword());
}
}
}
public static void main(String[] args) throws Exception {
SolrTest solr = new SolrTest();
//solr.createSolrServer();
// solr.addDoc();
// solr.deleteDocumentById();
solr.querySolr();
}
}
到這裏,你應該有點興奮了,經過努力實現了簡單運用solr。後續考慮在tomcat運行,實現定時增量導入,以及在java中更詳盡的應用。