相較 Lucene 需大量自行開發、搜尋引擎 API 索引不可控,Solr 提供開箱即用的全文搜尋服務:支援分散式叢集、豐富查詢語法、近即時索引、管理介面,是企業級站內搜尋首選。
solr-4.10.4.war,重命名為 solr.war 放入 webapps/example/lib/ext/*.jar 複製到 WEB-INF/lib/ (日誌依賴)example/solr/ 目錄作為 solrhome (如 /opt/solrhome)web.xml 配置 JNDI 指定 solrhome 路徑https://localhost:8080/solr 進入管理介面<field name="id" type="string" indexed="true" stored="true" required="true" /> <field name="title" type="text_ik" indexed="true" stored="true" /> <field name="price" type="float" indexed="true" stored="true" /> <field name="catalog_name" type="string" indexed="true" stored="true" /> <field name="keywords" type="text_ik" indexed="true" stored="false" multiValued="true" />
IKAnalyzer.jar 放入 WEB-INF/lib/,配置檔放入 classes/schema.xml 定義 fieldType:
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index" class="org.wltea.analyzer.lucene.IKAnalyzer" isMaxWordLength="false"/>
<analyzer type="query" class="org.wltea.analyzer.lucene.IKAnalyzer" isMaxWordLength="true"/>
</fieldType>
type="text_ik"<copyField source="title" dest="keywords"/> <copyField source="content" dest="keywords"/>
| 操作 | URL 範例 | 說明 |
|---|---|---|
| 新增/更新 | POST /update?commit=true Body: {"id":"1","title":"測試"} | ID 存在則更新 |
| 刪除 (ID) | POST /update?commit=true Body: <delete><id>1</id></delete> | |
| 刪除 (Query) | POST /update?commit=true Body: <delete><query>title:測試</query></delete> | |
| 批量匯入 (DIH) | 配置 data-config.xml + solrconfig.xml 請求處理器 | 定時/手動從 DB 全量/增量同步 |
GET /select?q=關鍵字
&fq=price:[10 TO 100] # 過濾查詢 (不影響分數)
&sort=price asc,createTime desc
&start=0&rows=10 # 分頁
&fl=id,title,price # 返回欄位
&df=keywords # 預設搜尋欄位
&wt=json # 返回格式
&hl=true&hl.fl=title # 高亮
&hl.simple.pre=<em>&hl.simple.post=</em>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>4.10.4</version>
</dependency>
// 建立連線 (SolrCloud 用 CloudSolrClient)
SolrClient client = new HttpSolrClient.Builder("https://localhost:8080/solr/core1").build();
// 新增文檔
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "1");
doc.addField("title", "SolrJ 測試");
client.add(doc);
client.commit();
// 查詢
SolrQuery query = new SolrQuery("關鍵字");
query.setStart(0).setRows(10);
query.setFields("id", "title", "price");
query.setHighlight(true).addHighlightField("title")
.setHighlightSimplePre("<em>").setHighlightSimplePost("</em>");
QueryResponse rsp = client.query(query);
SolrDocumentList results = rsp.getResults();
for (SolrDocument d : results) {
String title = rsp.getHighlighting().get(d.get("id")) != null
? rsp.getHighlighting().get(d.get("id")).get("title").get(0)
: (String) d.get("title");
System.out.println(title);
}
// 刪除
client.deleteById("1");
client.commit();
client.close();
-Xms4g -Xmx4g -XX:+UseG1GC,預留記憶體給 Lucene 索引檔案快取ReplicationHandler 備份到從節點Solr 功能強大但配置繁雜,建議從單機核心功能跑通,再逐步引入中文分詞、DIH、SolrCloud 叢集。掌握 Schema 設計與查詢參數調優,是打造高效搜尋服務的關鍵。