`

使用SolrJ生成索引

阅读更多
代码很简单, 直接看就明白了, 可以在实际工作中借鉴, 原文在这里. 这个例子使用两种方式来演示如何生成全量索引:
一个是从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();
      }
    }
  }
}
分享到:
评论
2 楼 macrochen 2012-02-27  
huangfoxAgain 写道
请问在3.x的solr中怎么解决“实时检索”的问题呢?
这里采用的应该是hard commit~


这里是针对全量索引.

实时检索可以参考Sensei

然后定时或者主动更新索引
1 楼 huangfoxAgain 2012-02-25  
请问在3.x的solr中怎么解决“实时检索”的问题呢?
这里采用的应该是hard commit~

相关推荐

    WebSolrDemo 全文检索,全文索引

    - **Java客户端API**:WebSolrDemo可能使用SolrJ库来与Solr服务器交互,包括添加、更新和查询索引。 - **数据导入工具**:可能是自定义的Java类,用于将应用数据导入Solr。 - **查询接口**:在Web应用程序中,用户...

    solr查询索引

    3. **查询处理**:当Solr接收到查询请求时,它会使用查询解析器来解释查询字符串,并生成一个解析后的查询树。然后,查询优化器可能会对查询进行调整,以提高性能。这一步涉及索引结构的快速访问,比如倒排索引。 4...

    org.apache.servicemix.bundles.solr-solrj-4.6.1_1.zip

    SolrJ是Apache Solr的Java客户端库,它允许开发者在Java应用程序中与Solr搜索引擎进行交互,包括创建、更新、查询索引以及管理Solr服务器。 描述中提到的 "maven-parent.zip" 暗示这个项目采用了Maven作为构建工具...

    Solr 查询,索引

    2. **分析与Token化**:Solr使用Analyzer将字段内容进行预处理,如分词、去除停用词、词形还原等,生成一系列的Token。 3. **倒排索引**:Solr的核心特性之一,将每个Token与它在哪些文档中出现的信息关联起来,...

    springboot整合redis集群、freemarker模板和多索引库solr,同时将redis集群作mybatis的二级缓存

    通过这样的整合,我们可以构建一个高性能、可扩展的应用,利用Redis作为缓存提升数据访问速度,使用Solr实现高效的全文搜索,而FreeMarker则为用户提供动态生成的视图。这样的架构在大型Web应用中非常常见,有助于...

    apache-solr-3.5.0.jar

    其中,Solr服务器的核心功能如索引存储、查询处理、请求处理器和响应生成器都封装在这个JAR文件里。此外,它还包含了配置文件和示例文档,帮助用户快速启动和配置Solr服务器。 2. `apache-solr-solrj-3.5.0.jar`: ...

    solr在java中使用总结

    Solr具备高度可配置性和可扩展性,支持通过HTTP请求提交XML文件来生成索引,同时也支持HTTP GET操作进行搜索查询,并能够返回XML格式的结果。 #### 二、Solr的主要特点 1. **高性能:**Solr拥有高效的索引和搜索...

    apache Solr API Docs 5.5.5 (CHM格式)

    用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。 从之前发布其他chm文件下载用户的反映看,有不少朋友反映下载后打开无法...

    solr导航搜索工具+文档+配置代码

    2. 集成Solr到Java应用:使用SolrJ客户端库,将Solr集成到Java应用程序中,实现数据的实时索引和搜索。 3. 调优和监控:优化Solr的配置,监控性能指标,确保系统的稳定性和高效性。 4. 高级特性:探索Solr的近实时...

    solr-parent.rar

    编译过程通常包括解压源码、设置环境变量、运行构建命令,然后生成可部署的 Solr 服务器和客户端库。 5. **扩展和自定义**: 通过源码,开发者可以了解 Solr 插件系统,比如自定义请求处理器、查询解析器、过滤器...

    SolrTest solr测试工程

    7. **Java API和HTTP接口**:SolrTest可能使用SolrJ,这是官方提供的Java客户端库,用于与Solr服务器通信。此外,通过HTTP接口(如使用POST请求发送JSON或XML),开发者也可以直接与Solr进行交互。 8. **部署和集群...

    QuinBookSolrSearch

    在QuinBookSolrSearch中,开发者可能使用SolrJ进行索引的创建、数据导入和查询结果的解析。 接着,项目可能涉及Solr的配置和优化。这可能包括设置Solr的配置文件(如solrconfig.xml和schema.xml),定义字段类型,...

    Solr调研总结共48页.pdf.zip

    15. **监控与日志**:监控Solr的性能指标,如查询响应时间、内存使用、索引大小等,有助于识别和解决性能问题。 以上内容仅为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...

    solr-6.3.0.zip

    开发人员可以使用SolrJ库在Java应用程序中与Solr交互,也可以使用HTTP API进行RESTful调用。Solr提供了丰富的API,包括XML、JSON和Binary格式,方便各种编程语言的集成。 总的来说,"solr-6.3.0.zip"是一个完整的...

    solr-4-10.3.zip

    11. **SolrJ客户端**: Solr提供了Java客户端库SolrJ,方便Java开发者与Solr服务器交互,进行索引构建和查询操作。 12. **安全与权限控制**: 虽然4.10.3版本的安全功能相对较弱,但可以通过与其他安全框架集成,实现...

    lucene3.6.2 jar包

    其中,索引模块提供了文档的存储和检索方式,查询模块则负责解析用户输入的查询语句并生成相应的查询对象。 2. **lucene-analyzers-3.6.2.jar**:这个库提供了各种文本分析器,用于处理和预处理输入的文本数据。...

    solr全文检索+IK分词器

    4. **上传数据**:使用Solr的`update`接口或者SolrJ等客户端工具,将需要索引的中文文本导入Solr。 5. **测试与优化**:进行查询测试,根据结果调整分词器配置,如停用词表、新词发现等。 通过以上步骤,我们可以...

    solr搜索引擎的使用介绍

    1. **全文搜索**:Solr支持对文本进行高效的全文检索,通过分词器和过滤器对输入的文本进行分析,生成可搜索的索引。 2. **多字段检索**:用户可以同时在多个字段上进行查询,Solr会根据权重返回最相关的结果。 3....

    java 调用solr最小依赖jiar包

    - `noggit.jar`:Noggit是一个快速的JSON解析器和生成器,Solr使用它来处理JSON格式的数据。 5. **Log4j**: - `log4j.jar`:Log4j是经典的日志框架,用于记录程序运行过程中的信息,包括错误、警告和调试信息。 ...

Global site tag (gtag.js) - Google Analytics