Apache Solr 是一个基于 Lucene 的开源搜索引擎。它提供了强大的全文检索功能,支持分布式索引、复制和负载均衡查询等功能。Solr 使用 HTTP 协议与客户端通信,并且可以通过 JSON 或 XML 格式返回结果。
下载Solr
首先从 Apache Solr官网 下载最新版本的 Solr。
启动Solr服务
解压后进入 bin
目录,运行以下命令启动 Solr:
./solr start
默认情况下,Solr会在8983端口上运行。你可以通过浏览器访问 http://localhost:8983/solr/
来查看管理界面。
创建Core
在 Solr 中,每个索引对应一个 Core。可以通过以下命令创建一个新的 Core:
./solr create -c mycore
配置Schema
Schema 文件定义了索引字段的结构。可以在 server/solr/mycore/conf/schema.xml
文件中进行配置。例如,添加一个文本字段:
<field name="content" type="text_general" indexed="true" stored="true"/>
要将 Solr 集成到 Java 应用程序中,可以使用 SolrJ 客户端库。以下是具体步骤:
添加依赖
如果你使用 Maven 构建项目,需要在 pom.xml
中添加 SolrJ 依赖:
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>8.11.1</version>
</dependency>
连接Solr服务器
使用 HttpSolrClient
类来连接 Solr 服务器:
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
public class SolrConnection {
public static SolrClient connectToSolr() {
String solrUrl = "http://localhost:8983/solr/mycore";
return new HttpSolrClient.Builder(solrUrl).build();
}
}
添加文档到索引
使用 SolrInputDocument
将数据添加到索引中:
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrInputDocument;
import java.io.IOException;
public class SolrIndexing {
public static void addDocument(SolrClient solr) throws SolrServerException, IOException {
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "1");
doc.addField("content", "This is a sample document for full-text search.");
UpdateResponse response = solr.add(doc);
solr.commit();
System.out.println("Document added with status: " + response.getStatus());
}
}
执行全文检索
使用 SolrQuery
类构建查询并获取结果:
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.common.SolrDocumentList;
import java.io.IOException;
public class SolrSearching {
public static void searchDocuments(SolrClient solr) throws SolrServerException, IOException {
SolrParams params = new ModifiableSolrParams();
params.set("q", "content:sample");
QueryResponse response = solr.query(params);
SolrDocumentList results = response.getResults();
System.out.println("Found " + results.getNumFound() + " documents.");
for (int i = 0; i < results.size(); ++i) {
System.out.println(results.get(i));
}
}
}
完整示例代码
将上述代码整合为一个完整的示例:
public class SolrExample {
public static void main(String[] args) {
try {
SolrClient solr = SolrConnection.connectToSolr();
SolrIndexing.addDocument(solr);
SolrSearching.searchDocuments(solr);
solr.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
分词器(Tokenizer)
Solr 支持多种分词器,可以根据语言和需求选择合适的分词器。例如,中文可以使用 IK 分词器或 SmartCN 分词器。
性能优化
安全管理
Solr 提供了基本的身份验证和授权功能,可以通过配置文件启用这些功能。