Solr以前的版本須要依託於Tomcat做爲載體才能進行使用,不過如今Solr已經支持獨立運行,解壓後運行指令即可啓用。安裝以前須要注意,Solr 8版本所須要的JDK須要8.0或以上。html
[root@localhost]# wget http://mirror.bit.edu.cn/apache/lucene/solr/8.0.0/solr-8.0.0.tgz
[root@localhost]# tar -zxvf solr-8.0.0.tgz
複製代碼
bin/solr
(*nix下),bin/solr.cmd
(Windows下)。這也是Apache最爲推薦的去啓動或中止Solr的運行工具。server/solr-webapp
)server/lib
)server/logs
)以及日誌配置文件(server/resources
)server/solr/configsets
)進入bin目錄下經過腳本啓動Solr:java
[root@localhost]# cd solr-8.0.0/bin
[root@localhost]# ./solr start
複製代碼
當一上來啓動時,系統會以下報錯,表示您的最大打開文件數、最大進程數應該上調到65000。若是root用戶啓動還會警告存在風險,須要添加-force纔可啓動。mysql
*** [WARN] *** Your open file limit is currently 1024.
It should be set to 65000 to avoid operational disruption.
If you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to false in your profile or solr.in.sh
*** [WARN] *** Your Max Processes Limit is currently 7183.
It should be set to 65000 to avoid operational disruption.
If you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to false in your profile or solr.in.sh
WARNING: Starting Solr as the root user is a security risk and not considered best practice. Exiting.
Please consult the Reference Guide. To override this check, start with argument '-force'
複製代碼
咱們能夠經過修改打開文件、進程限制值解決限制的問題,也能夠經過修改solr.in.sh關閉SOLR_ULIMIT_CHECKS檢查,強制啓動。web
[root@localhost]# vim solr.in.sh
複製代碼
[root@localhost]# ./solr start -p 8983 -force # -p 指定端口默認8983 -force(root用戶必選)
NOTE: Please install lsof as this script needs it to determine if Solr is listening on port 80.
Started Solr server on port 80 (pid=19359). Happy searching!
[root@localhost]#
複製代碼
訪問一下,看到儀表盤即爲大功告成:spring
在管理頁面建立core以前,須要在server
下的solr
目錄下創建一個和將要建立core同名的文件夾。並在該文件夾下建立conf
(配置文件夾),將配置文件放入其中。在server/solr/configsets/
目錄下有能夠直接拽過來用的配置模板,本文直接把_default
下的conf
文件夾拽過來使用。sql
[root@localhost]# cd solr-8.0.0/server/solr
[root@localhost]# mkdir test # 爲將要建立core的名稱
[root@localhost]# cp -rf configsets/_default/conf test/
複製代碼
而後咱們去Solr管理界面建立core: shell
在操做Core以前,須要在建立的core的conf
下的managed-schema
文件中添加須要用到的字段。關於Documents、Fields、Schema的設計可在官方文檔中查看。除了幾個默認字段,本文所用到的:數據庫
<field name="company" type="string" multiValued="false" indexed="true" stored="true"/>
<field name="person" type="string" multiValued="false" indexed="true" stored="true"/>
複製代碼
添加完了去刷新一下core apache
Schema
選項,出現相應字段即爲添加成功:
在旁邊一列的Documents
下進行添加操做: vim
旁邊的Query
界面中可進行查詢。q下面的一行表示查詢的參數,左 * 是字段名,右 * 是查詢條件, *表明任意值,下圖爲查詢全部記錄:
Solr中的全部字段中存在一個惟一索引字段,可在managed-schema
中的 <uniqueKey></uniqueKey>
中定義,默認id
字段爲惟一索引。修改時只須要再次添加惟一索引字段索引的內容便可完成更新替換。
在添加界面內(Documents
)的Document Type
中選擇XML方式,可根據id和根據查詢進行刪除。
<delete>
<id>1</id>
</delete>
<commit/>
複製代碼
<delete>
<query>person:馬化騰</query>
</delete>
<commit/>
複製代碼
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
複製代碼
spring:
data:
solr:
host: http://192.168.78.132:8983/solr/test #http://你的地址/solr/你建立的core的名稱
複製代碼
package com.yurui.solrjdemo.entity;
import org.apache.solr.client.solrj.beans.Field;
public class Info {
@Field //將要添加到Solr中的字段的註解
private String id;
@Field
private String person;
@Field
private String company;
//setters,getters,toString省略
}
複製代碼
package com.yurui.solrjdemo;
import com.yurui.solrjdemo.entity.Info;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
import java.util.ArrayList;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SolrjdemoApplicationTests {
@Autowired
private SolrClient solrClient;
@Test
public void test() throws IOException, SolrServerException {
// 普通字段添加
SolrInputDocument solrDocument = new SolrInputDocument();
solrDocument.addField("id", "1");
solrDocument.addField("person", "李彥宏");
solrDocument.addField("company", "百度");
solrClient.add(solrDocument);
// 實體類添加
Info info = new Info();
info.setId("2");
info.setPerson("無名氏");
info.setCompany("無名氏");
solrClient.addBean(info);
// 提交
solrClient.commit();
getAll();
// 經過查詢刪除
solrClient.deleteByQuery("company:百度");
solrClient.commit();
getAll();
// 經過id刪除
solrClient.deleteById("2");
solrClient.commit();
getAll();
}
/* 查詢全部 */
public void getAll() throws IOException, SolrServerException {
SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery("*:*"); //設置查詢參數
QueryResponse response = solrClient.query(solrQuery);
System.out.println("全部信息:");
ArrayList<Info> list = (ArrayList<Info>) response.getBeans(Info.class);
for (Info temp : list) {
System.out.println(temp);
}
}
}
複製代碼
測試效果:
本人用到的數據表結構與數據:
導入數據庫數據須要把MySQL驅動mysql-connector-java-8.0.15.jar
,Solr目錄中dist/
下的solr-dataimporthandler-8.0.0.jar
、solr-dataimporthandler-extras-8.0.0.jar
移動到server/solr-webapp/webapp/WEB-INF/lib
下。
在core的配置文件夾中的solrconfig.xml
中添加:
<requestHandler name="/dataimport" class="solr.DataImportHandler">
<lst name="defaults">
<str name="config">db-data-config.xml</str>
</lst>
</requestHandler>
複製代碼
以後再在配置文件夾中創建與<str></str>
中同名文件,並進行配置:
<dataConfig>
<dataSource driver="com.mysql.jdbc.Driver" url="你的url" user="你的用戶" password="你的密碼" />
<document>
<entity name="info" query="select * from info">
<field column="id" name="id" />
<field column="person" name="person" />
<field column="company" name="company" />
</entity>
</document>
</dataConfig>
複製代碼
entity
的query
對應得到數據的SQL語句。field
標籤中column
對應數據庫的字段名,name
對應managed-schema
中的字段名。在運行以前須要確保相應字段已經在managed-schema
中定義,而且可以成功訪問到數據庫。
先重啓一下Solr,而後去管理界面對應Core下的Dataimport
下操做:
Solr官方自帶了簡體中文分詞器HMM Chinese Tokenizer
,存放在contrib/analysis-extras/lucene-libs
下的lucene-analyzers-smartcn-8.0.0.jar
。
首先使用這個插件須要咱們把lucene-analyzers-smartcn-8.0.0.jar
移動到server/solr-webapp/webapp/WEB-INF/lib
下
在對應core下的managed-schema
中添加以下示例配置(來自官方文檔示例):
<fieldType name="text_cn" class="solr.TextField">
<analyzer>
<tokenizer class="solr.HMMChineseTokenizerFactory"/>
<filter class="solr.CJKWidthFilterFactory"/>
<filter class="solr.StopFilterFactory" words="你所定義的中文停用詞表"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
複製代碼
修改完後重啓Solr,進入管理界面對應core下的Analysis
,出現fieldType
中對應的name
即爲添加成功。
<field name="testChinese" type="text_cn" multiValued="false" indexed="true" stored="true"/>
複製代碼
而後添加剛纔測試的語句,「今天是假期的最後一天」: