solr經常使用的命令php
solr start -p p_num 啓動solr
solr restart -p p_num 重啓solr
solr stop -p p_num 關閉solr
solr create -c c_name 建立一個核心
複製代碼
solr 的安裝工做到此就結束了。html
每一個核心都是solr的一個實例,一個solr服務能夠建立多個核心,每一個核心均可以進行本身獨立配置。java
這種方式 須要 在 E:\solr-8.1.1\server\solr 目錄下建立 new_core文件夾mysql
每一個核心core中都有這麼一個 schema配置文件。 schema文件能夠對索引庫的數據類型進行定義,對字段是否進行索引、存儲等進行配置,須要針對狠心單獨進行配置。 schema的數據類型進本夠用,若是不能知足需求,好比說對中文分詞、拼音分詞等,就能夠自定義分詞器。 Solr8.1.1 的schema的配置文件名 爲managed-schema,home\server\solr\new_core\conf\managed-schema(E:\solr-8.1.1\server\solr\core_issuer\conf)。web
<fieldType name="text_tr" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.TurkishLowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory" words="lang/stopwords_tr.txt" ignoreCase="false"/>
<filter class="solr.SnowballPorterFilterFactory" language="Turkish"/>
</analyzer>
</fieldType>
複製代碼
<field name="age" type="pint" indexed="true" stored="true"/>
複製代碼
<field name="age" type="pint" indexed="true" stored="true"/>
複製代碼
![](_v_images/20190623133627274_22114.png =811x)sql
<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>
複製代碼
6.在ext.dic文件中添加自定義的中文詞組shell
須要重啓solr數據庫
效果以下: apache
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/solr_test" user="root" password=""/>
<document>
<entity name="user" query="select * from user">
<field column="id" name="id"/>
<field column="age" name="age"/>
<field column="name" name="name"/>
<field column="hobby" name="hobby"/>
</entity>
</document>
</dataConfig>
複製代碼
<field name="name" type="string" indexed="true" stored="true"/>
<field name="age" type="pint" indexed="true" stored="true"/>
<field name="hobby" type="string" indexed="true" stored="true"/>
複製代碼
請勿添加id字段,該字段已存在,添加會報錯瀏覽器
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">my-data-config.xml</str>
</lst>
</requestHandler>
複製代碼
添加對索引字段時,fileType :選擇text_ik
效果如圖: 查詢 魯西化工 的結果
<!--solr -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>8.1.1</version>
</dependency>
複製代碼
public class User {
@Field(value = "id")
private String id;
@Field(value = "name")
private String name;
@Field(value = "age")
private Integer age;
@Field(value = "hobby")
private String hobby;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", hobby=" + hobby +
'}';
}
}
複製代碼
public class Main {
private static final String SOLR_URL = "http://localhost:8888/solr";
private static final String CORE_NAME = "new_core";
public static void main(String[] args) throws IOException, SolrServerException {
HttpSolrClient client = new HttpSolrClient.Builder(SOLR_URL).withConnectionTimeout(10000).withSocketTimeout(60000).build();
SolrQuery query = new SolrQuery();
//設置要查詢的字段
query.setFields("id","name", "age","hobby");
//查詢所有
QueryResponse response = client.query(CORE_NAME,query);
//查詢結果
SolrDocumentList results = response.getResults();
System.out.println("結果總數:" + results.getNumFound());
//遍歷列表
System.out.println("文檔結果:");
for (SolrDocument doc : results) {
System.out.printf("[id:%s,name:%s,age:%s,hobby:%s]\n", doc.get("id"), doc.get("name"), doc.get("age"), doc.get("hobby"));
}
//獲得實體對象
List<User> userList = response.getBeans(User.class);
System.out.println("轉爲實體對象:\n"+Arrays.toString(userList.toArray()));
}
}
複製代碼
**按條件單個查詢: **
//查詢name爲「陳龍」的user
query.set("q","name:陳龍" );
複製代碼
過濾查詢
//查詢name爲「陳龍」的user
query.set("q","name:陳龍" );
複製代碼
準備工做:
** 注意注意注意(重要的事情說三遍):當solr7+以上版本時,該jar包會有問題,配置後服務器啓動會報錯,頁面404,具體詳情後面會有解決方案。**
我的網盤分享:連接:pan.baidu.com/s/1HT9WzXQx… 提取碼:ehju
這個對7+版本能夠正常使用
#################################################
# #
# dataimport scheduler properties #
# #
#################################################
# to sync or not to sync
# 1 - active; anything else - inactive
# 這裏的配置不用修改
syncEnabled=1
# which cores to schedule
# in a multi-core environment you can decide which cores you want syncronized
# leave empty or comment it out if using single-core deployment
# 修改爲你所使用的core,我這裏是我自定義的core:simple
syncCores=core_issuer
# solr server name or IP address
# [defaults to localhost if empty]
這個通常都是localhost不會變
server=localhost
# solr server port
# [defaults to 80 if empty]
# 安裝solr的tomcat端口,若是你使用的是默認的端口,就不用改了,不然改爲本身的端口就行了
port=8983
# application name/context
# [defaults to current ServletContextListener's context (app) name]
# 這裏默認不改
webapp=solr
# URL params [mandatory]
# remainder of URL
# 這裏改爲下面的形式,solr同步數據時請求的連接 (我這裏使用的 full-import )
params=/dataimport?command=full-import&clean=true&commit=true
# schedule interval
# number of minutes between two runs
# [defaults to 30 if empty]
#這裏是設置定時任務的,單位是分鐘,也就是多長時間你檢測一次數據同步,根據項目需求修改
# 開始測試的時候爲了方便看到效果,時間能夠設置短一點
interval=1
# 重作索引的時間間隔,單位分鐘,默認7200,即5天;
# 爲空,爲0,或者註釋掉:表示永不重作索引
reBuildIndexInterval=7200
# 重作索引的參數
reBuildIndexParams=/select?qt=/dataimport&command=full-import&clean=true&commit=true
# 重作索引時間間隔的計時開始時間,第一次真正執行的時間=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
# 兩種格式:2012-04-11 03:10:00 或者 03:10:00,後一種會自動補全日期部分爲服務啓動時的日期
reBuildIndexBeginTime=03:10:00
複製代碼
準備好這一個jar包和dataimport.properties文件,開始下面的步驟……
<listener>
<listener-class>org.apache.solr.handler.dataimport.scheduler.ApplicationListener</listener-class>
</listener>
複製代碼
注意(又一個注意的地方):org.apache.solr.handler.dataimport.scheduler.ApplicationListener 後面不能有空格,不然可能會報錯,且很難發現問題緣由。
@Test
public void deleteAll(){
try {
searchCrawlerProductService.deleteAll();
} catch (Exception e) {
e.printStackTrace();
}
}
複製代碼
public RestResult deleteAll(){
try {
log.debug("刪除全部索引");
solrClient.deleteByQuery("*:*"); //把刪除的條件設置爲"*:*"就能夠了
solrClient.commit();
log.debug("所有刪除成功");
} catch (Exception e) {
log.debug("刪除所有索引失敗");
e.printStackTrace();
}
return RestResult.success("刪除索引庫成功");
}
複製代碼