首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Solr 入門到實戰:安裝、Schema 設計、索引維護、SolrJ 整合全攻略

     編輯:Java 綜合教學

為什麼選 Solr?

相較 Lucene 需大量自行開發、搜尋引擎 API 索引不可控,Solr 提供開箱即用的全文搜尋服務:支援分散式叢集、豐富查詢語法、近即時索引、管理介面,是企業級站內搜尋首選。

1. 環境與安裝 (Solr 4.10 + Tomcat 7)

  1. JDK 1.7+、Tomcat 7.0+
  2. 下載 solr-4.10.4.war,重命名為 solr.war 放入 webapps/
  3. 解壓 WAR,將 example/lib/ext/*.jar 複製到 WEB-INF/lib/ (日誌依賴)
  4. 複製 example/solr/ 目錄作為 solrhome (如 /opt/solrhome)
  5. 在 web.xml 配置 JNDI 指定 solrhome 路徑
  6. 啟動 Tomcat,訪問 https://localhost:8080/solr 進入管理介面

2. 核心概念

  • Core (Collection):一個索引庫,對應一個資料庫
  • Schema.xml:定義 Field、類型、分析器、唯一鍵、複製欄位
  • solrconfig.xml:請求處理器、快取、資料匯入等配置

3. Schema 設計重點

Field 定義

<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)

  1. 將 IKAnalyzer.jar 放入 WEB-INF/lib/,配置檔放入 classes/
  2. 在 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>
  3. 欄位引用 type="text_ik"

CopyField 自動聚合搜尋詞

<copyField source="title" dest="keywords"/>
<copyField source="content" dest="keywords"/>

4. 索引維護 (HTTP API / 管理介面)

操作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 全量/增量同步

5. 查詢語法與參數

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>

6. SolrJ 客戶端整合 (Java)

Maven 依賴

<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();

7. 生產環境建議

  • SolrCloud:ZooKeeper 協調,支援分片、副本、自動故障轉移
  • JVM 調優:-Xms4g -Xmx4g -XX:+UseG1GC,預留記憶體給 Lucene 索引檔案快取
  • 監控:JMX / Prometheus 監控 QPS、延遲、快取命中率、GC
  • 備份:定期快照索引目錄,或使用 ReplicationHandler 備份到從節點

結語

Solr 功能強大但配置繁雜,建議從單機核心功能跑通,再逐步引入中文分詞、DIH、SolrCloud 叢集。掌握 Schema 設計與查詢參數調優,是打造高效搜尋服務的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved