代码很简单, 直接看就明白了, 可以在实际工作中借鉴, 原文在
这里. 这个例子使用两种方式来演示如何生成全量索引:
一个是从db中通过sql生成全量索引
一个是通过tika解析文件生成全量索引
package SolrJExample;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.StreamingUpdateSolrServer;
import org.apache.solr.client.solrj.impl.XMLResponseParser;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrInputDocument;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.sax.BodyContentHandler;
import org.xml.sax.ContentHandler;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.ArrayList;
import java.util.Collection;
/* Example class showing the skeleton of using Tika and
Sql on the client to index documents from
both structured documents and a SQL database.
NOTE: The SQL example and the Tika example are entirely orthogonal.
Both are included here to make a
more interesting example, but you can omit either of them.
*/
public class SqlTikaExample {
private StreamingUpdateSolrServer _server;
private long _start = System.currentTimeMillis();
private AutoDetectParser _autoParser;
private int _totalTika = 0;
private int _totalSql = 0;
private Collection _docs = new ArrayList();
public static void main(String[] args) {
try {
SqlTikaExample idxer = new SqlTikaExample("http://localhost:8983/solr");
idxer.doTikaDocuments(new File("/Users/Erick/testdocs"));
idxer.doSqlDocuments();
idxer.endIndexing();
} catch (Exception e) {
e.printStackTrace();
}
}
private SqlTikaExample(String url) throws IOException, SolrServerException {
// Create a multi-threaded communications channel to the Solr server.
// Could be CommonsHttpSolrServer as well.
//
_server = new StreamingUpdateSolrServer(url, 10, 4);
_server.setSoTimeout(1000); // socket read timeout
_server.setConnectionTimeout(1000);
_server.setMaxRetries(1); // defaults to 0. > 1 not recommended.
// binary parser is used by default for responses
_server.setParser(new XMLResponseParser());
// One of the ways Tika can be used to attempt to parse arbitrary files.
_autoParser = new AutoDetectParser();
}
// Just a convenient place to wrap things up.
private void endIndexing() throws IOException, SolrServerException {
if (_docs.size() > 0) { // Are there any documents left over?
_server.add(_docs, 300000); // Commit within 5 minutes
}
_server.commit(); // Only needs to be done at the end,
// commitWithin should do the rest.
// Could even be omitted
// assuming commitWithin was specified.
long endTime = System.currentTimeMillis();
log("Total Time Taken: " + (endTime - _start) +
" milliseconds to index " + _totalSql +
" SQL rows and " + _totalTika + " documents");
}
// I hate writing System.out.println() everyplace,
// besides this gives a central place to convert to true logging
// in a production system.
private static void log(String msg) {
System.out.println(msg);
}
/**
* ***************************Tika processing here
*/
// Recursively traverse the filesystem, parsing everything found.
private void doTikaDocuments(File root) throws IOException, SolrServerException {
// Simple loop for recursively indexing all the files
// in the root directory passed in.
for (File file : root.listFiles()) {
if (file.isDirectory()) {
doTikaDocuments(file);
continue;
}
// Get ready to parse the file.
ContentHandler textHandler = new BodyContentHandler();
Metadata metadata = new Metadata();
ParseContext context = new ParseContext();
InputStream input = new FileInputStream(file);
// Try parsing the file. Note we haven't checked at all to
// see whether this file is a good candidate.
try {
_autoParser.parse(input, textHandler, metadata, context);
} catch (Exception e) {
// Needs better logging of what went wrong in order to
// track down "bad" documents.
log(String.format("File %s failed", file.getCanonicalPath()));
e.printStackTrace();
continue;
}
// Just to show how much meta-data and what form it's in.
dumpMetadata(file.getCanonicalPath(), metadata);
// Index just a couple of the meta-data fields.
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", file.getCanonicalPath());
// Crude way to get known meta-data fields.
// Also possible to write a simple loop to examine all the
// metadata returned and selectively index it and/or
// just get a list of them.
// One can also use the LucidWorks field mapping to
// accomplish much the same thing.
String author = metadata.get("Author");
if (author != null) {
doc.addField("author", author);
}
doc.addField("text", textHandler.toString());
_docs.add(doc);
++_totalTika;
// Completely arbitrary, just batch up more than one document
// for throughput!
if (_docs.size() >= 1000) {
// Commit within 5 minutes.
UpdateResponse resp = _server.add(_docs, 300000);
if (resp.getStatus() != 0) {
log("Some horrible error has occurred, status is: " +
resp.getStatus());
}
_docs.clear();
}
}
}
// Just to show all the metadata that's available.
private void dumpMetadata(String fileName, Metadata metadata) {
log("Dumping metadata for file: " + fileName);
for (String name : metadata.names()) {
log(name + ":" + metadata.get(name));
}
log("\n\n");
}
/**
* ***************************SQL processing here
*/
private void doSqlDocuments() throws SQLException {
Connection con = null;
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
log("Driver Loaded......");
con = DriverManager.getConnection("jdbc:mysql://192.168.1.103:3306/test?"
+ "user=testuser&password=test123");
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("select id,title,text from test");
while (rs.next()) {
// DO NOT move this outside the while loop
// or be sure to call doc.clear()
SolrInputDocument doc = new SolrInputDocument();
String id = rs.getString("id");
String title = rs.getString("title");
String text = rs.getString("text");
doc.addField("id", id);
doc.addField("title", title);
doc.addField("text", text);
_docs.add(doc);
++_totalSql;
// Completely arbitrary, just batch up more than one
// document for throughput!
if (_docs.size() > 1000) {
// Commit within 5 minutes.
UpdateResponse resp = _server.add(_docs, 300000);
if (resp.getStatus() != 0) {
log("Some horrible error has occurred, status is: " +
resp.getStatus());
}
_docs.clear();
}
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (con != null) {
con.close();
}
}
}
}
分享到:
相关推荐
- **Java客户端API**:WebSolrDemo可能使用SolrJ库来与Solr服务器交互,包括添加、更新和查询索引。 - **数据导入工具**:可能是自定义的Java类,用于将应用数据导入Solr。 - **查询接口**:在Web应用程序中,用户...
3. **查询处理**:当Solr接收到查询请求时,它会使用查询解析器来解释查询字符串,并生成一个解析后的查询树。然后,查询优化器可能会对查询进行调整,以提高性能。这一步涉及索引结构的快速访问,比如倒排索引。 4...
SolrJ是Apache Solr的Java客户端库,它允许开发者在Java应用程序中与Solr搜索引擎进行交互,包括创建、更新、查询索引以及管理Solr服务器。 描述中提到的 "maven-parent.zip" 暗示这个项目采用了Maven作为构建工具...
2. **分析与Token化**:Solr使用Analyzer将字段内容进行预处理,如分词、去除停用词、词形还原等,生成一系列的Token。 3. **倒排索引**:Solr的核心特性之一,将每个Token与它在哪些文档中出现的信息关联起来,...
通过这样的整合,我们可以构建一个高性能、可扩展的应用,利用Redis作为缓存提升数据访问速度,使用Solr实现高效的全文搜索,而FreeMarker则为用户提供动态生成的视图。这样的架构在大型Web应用中非常常见,有助于...
其中,Solr服务器的核心功能如索引存储、查询处理、请求处理器和响应生成器都封装在这个JAR文件里。此外,它还包含了配置文件和示例文档,帮助用户快速启动和配置Solr服务器。 2. `apache-solr-solrj-3.5.0.jar`: ...
Solr具备高度可配置性和可扩展性,支持通过HTTP请求提交XML文件来生成索引,同时也支持HTTP GET操作进行搜索查询,并能够返回XML格式的结果。 #### 二、Solr的主要特点 1. **高性能:**Solr拥有高效的索引和搜索...
用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。 从之前发布其他chm文件下载用户的反映看,有不少朋友反映下载后打开无法...
2. 集成Solr到Java应用:使用SolrJ客户端库,将Solr集成到Java应用程序中,实现数据的实时索引和搜索。 3. 调优和监控:优化Solr的配置,监控性能指标,确保系统的稳定性和高效性。 4. 高级特性:探索Solr的近实时...
编译过程通常包括解压源码、设置环境变量、运行构建命令,然后生成可部署的 Solr 服务器和客户端库。 5. **扩展和自定义**: 通过源码,开发者可以了解 Solr 插件系统,比如自定义请求处理器、查询解析器、过滤器...
7. **Java API和HTTP接口**:SolrTest可能使用SolrJ,这是官方提供的Java客户端库,用于与Solr服务器通信。此外,通过HTTP接口(如使用POST请求发送JSON或XML),开发者也可以直接与Solr进行交互。 8. **部署和集群...
在QuinBookSolrSearch中,开发者可能使用SolrJ进行索引的创建、数据导入和查询结果的解析。 接着,项目可能涉及Solr的配置和优化。这可能包括设置Solr的配置文件(如solrconfig.xml和schema.xml),定义字段类型,...
15. **监控与日志**:监控Solr的性能指标,如查询响应时间、内存使用、索引大小等,有助于识别和解决性能问题。 以上内容仅为Solr调研总结可能涵盖的关键点,实际报告可能还会深入探讨这些话题,并提供案例研究、...
3. **编写代码**:利用 SolrJ API 实现数据索引和搜索功能。 ```java import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client...
开发人员可以使用SolrJ库在Java应用程序中与Solr交互,也可以使用HTTP API进行RESTful调用。Solr提供了丰富的API,包括XML、JSON和Binary格式,方便各种编程语言的集成。 总的来说,"solr-6.3.0.zip"是一个完整的...
11. **SolrJ客户端**: Solr提供了Java客户端库SolrJ,方便Java开发者与Solr服务器交互,进行索引构建和查询操作。 12. **安全与权限控制**: 虽然4.10.3版本的安全功能相对较弱,但可以通过与其他安全框架集成,实现...
其中,索引模块提供了文档的存储和检索方式,查询模块则负责解析用户输入的查询语句并生成相应的查询对象。 2. **lucene-analyzers-3.6.2.jar**:这个库提供了各种文本分析器,用于处理和预处理输入的文本数据。...
4. **上传数据**:使用Solr的`update`接口或者SolrJ等客户端工具,将需要索引的中文文本导入Solr。 5. **测试与优化**:进行查询测试,根据结果调整分词器配置,如停用词表、新词发现等。 通过以上步骤,我们可以...
1. **全文搜索**:Solr支持对文本进行高效的全文检索,通过分词器和过滤器对输入的文本进行分析,生成可搜索的索引。 2. **多字段检索**:用户可以同时在多个字段上进行查询,Solr会根据权重返回最相关的结果。 3....
- `noggit.jar`:Noggit是一个快速的JSON解析器和生成器,Solr使用它来处理JSON格式的数据。 5. **Log4j**: - `log4j.jar`:Log4j是经典的日志框架,用于记录程序运行过程中的信息,包括错误、警告和调试信息。 ...