zoukankan      html  css  js  c++  java
  • sorl6.0+jetty+mysql搭建solr服务

    1.下载solr

      官网:http://lucene.apache.org/solr/

    2.目录结构如下

    3.启动solr(默认使用jetty部署)

      在path路径下将 bin文件夹对应的目录加入,然后输入 solr start(或者 solr start -p port,指定端口启动)。在浏览器中访问如下:

      当然,还可以启动其他样例的服务,在example目录下有一个READEME.txt,如果感兴趣请看一下。命令格式如下:

    Solr example
    ------------
    
    This directory contains Solr examples. Each example is contained in a 
    separate directory. To run a specific example, do:
    
      bin/solr -e <EXAMPLE> where <EXAMPLE> is one of:
      
        cloud        : SolrCloud example
        dih          : Data Import Handler (rdbms, mail, rss, tika)
        schemaless   : Schema-less example (schema is inferred from data during indexing)
        techproducts : Kitchen sink example providing comprehensive examples of Solr features

    4.Individual SolrCore

      在server/solr目录下,有一个README.txt的文件,其中说明了如何建立solr core。最简单的建立是直接复制solr中为我们提供好的例子,打开server/solr/configsets目录会发现里面已经有三个例子,因为我们是要从数据库导入数据,所以复制 “data_driven_schema_configs” 这个例子并改名为 “myCollections”。

    5.导入需要的jar包

      为了导入数据和链接mysql,我们还需要导入两个重要的jar包。由于mysql的jar包并没有在项目中,我是复制了一份放到了dist目录下面了。另外两个需要的jar包就是dist目录下带有“dataimport”标识的jar包。

      然后打开myCollections/conf/solrconfig.xml,引用上面提到的jar包,如下。

    6.建立数据库

      建立好之后,随便写入一点儿数据。

    7.添加requestHandler 

      继续修改myCollections/conf/solrconfig.xml,搜索 <requestHandler name="/select" class="solr.SearchHandler"> ,然后在该行之上添加如下代码。

      <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">  
          <lst name="defaults">  
             <str name="config">data-config.xml</str>  
          </lst>  
     </requestHandler>  

    8.建立连接配置文件

      在myCollections/conf目录下新建data-config.xml, 内容如下。

    <?xml version="1.0" encoding="UTF-8"?>  
    <dataConfig>  
        <dataSource name="source1" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/solrdata" user="root" password="123456" batchSize="-1" />  
      <document>  
            <entity name="goods" pk="id"  dataSource="source1"   
                    query="select * from  goods"  
                    deltaImportQuery="select * from goods where id='${dih.delta.id}'"  
                    deltaQuery="select id from goods where updateTime> '${dataimporter.last_index_time}'">  
      
             <field column="id" name="id"/>  
             <field column="name" name="name"/>  
               <field column="number" name="number"/>  
               <field column="updateTime" name="updateTime"/>  
         </entity>  
      </document>  
    </dataConfig>  

     说明:

      dataSource是数据库数据源。Entity就是一张表对应的实体,pk是主键,query是查询语句。Field对应一个字段,column是数据库里的column名,后面的name属性对应着Solr的Filed的名字。其中solrdata是数据库名,goods是表名。

      其中deltaQuery是增量索引,原理是从数据库中根据deltaQuery指定的SQL语句查询出所有需要增量导入的数据的ID号。然后根据deltaImportQuery指定的SQL语句返回所有这些ID的数据,即为这次增量导入所要处理的数据。核心思想是:通过内置变量“${dih.delta.id}”和 “${dataimporter.last_index_time}”来记录本次要索引的id和最近一次索引的时间。

    9.managed-schema配置field信息

      搜索 <field name= ,添加关联数据库表Column的信息。

      注意:默认的 filed 不要删除哦!

    10.添加我们刚刚建立的core

      (1).点击Core Admin,配置我们建立的solr Core的信息,如下所示。

      (2).点击 Add Core,如下所示。

      (3).测试索引是否成功

                                       

    索引成功

      (4).监测查询成功

    查询成功

    11.通过代码调用solr服务

      简单建立一个java项目,依赖上dist目录下的solr-solrj-6.0.0.jar。

      测试代码如下。

    import java.lang.reflect.Method;
    import java.sql.Timestamp;
    import org.apache.solr.client.solrj.SolrQuery;
    import org.apache.solr.client.solrj.impl.HttpSolrServer;
    import org.apache.solr.client.solrj.response.QueryResponse;
    import org.apache.solr.common.SolrInputDocument;
    import com.entity.Good;
    
    @SuppressWarnings("deprecation")
    public class Solr {
            private static HttpSolrServer solrServer;
    
            static {
                //注意请求地址格式:浏览器中的地址有 ‘#’,需要把‘#’去掉!
                solrServer = new HttpSolrServer("http://localhost:8983/solr/hjz");
                solrServer.setConnectionTimeout(5000);
            }
    
            /**
             * 添加单个文档 。
             * 
             * @param article 文章对象
             * @param articleAddon 文章正文对象
             */
            public static void insert(Good good) {
                SolrInputDocument doc = new SolrInputDocument();
                doc.addField("id", good.getId());
                doc.addField("name", good.getName());
                doc.addField("number", good.getNumber());
                doc.addField("updateTime", good.getUpdateTime());
                
                try {
                    solrServer.add(doc);
                    solrServer.commit();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            
            /**
             * 根据文档id删除文档 。
             */
            public static void deleteById(String id) {
                try {
                    solrServer.deleteById(id+"");
                    solrServer.commit();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            
            /**
             * 删除所有文档,为安全起见,使用时再解注函数体 。
             */
            public static void deleteAll() {
                try {
                    solrServer.deleteByQuery("*:*");
                    solrServer.commit();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            
            /**
             * 更新文档,其实也是通过insert操作来完成 。
             * 
             * @param article 文章对象
             * @param articleAddon 文章内容对象,如果不更新正文,可以为null。
             */
            public static void update(Good good) {
                insert(good);
            }
            
            /**
             * 根据文档id查询单个文档 。
             * @return 
             */
            public static <T> T getById(int id, Class<T> clazz) {
                SolrQuery query = new SolrQuery();
                query.setQuery("id:" + id);
                
                try {
                    QueryResponse rsp = solrServer.query(query);
                    return rsp.getBeans(clazz).get(0);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }    
            
            /**
             * @param obj 对象索引
             * @param idName 主键名称
             */
            public static void deleteByObject(Object obj, String idName){
                try {
                    Class<?> clazz = obj.getClass();
                    //将idName的首字母变成大写
                    if(Character.isLowerCase(idName.charAt(0))) idName = Character.toUpperCase(idName.charAt(0)) + idName.substring(1);
                    Method method = clazz.getMethod("get"+idName);
                    String idValue = (String) method.invoke(obj);
                    deleteById(idValue);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            
            public static void main(String[] args){
                Good good = new Good("123", 9999, "hjzgg5211314", new Timestamp(System.currentTimeMillis()));
                //Solr.update(good);
                //System.out.println(Solr.getById(123, Good.class));
                deleteByObject(good, "id");
            }
    }
    View Code

      对应的实体类。

    import java.sql.Timestamp;
    
    import org.apache.solr.client.solrj.beans.Field;
    
    public class Good{
        @Field("id")
        private String id;
        @Field("number")
        private int number;
        @Field("name")
        private String name;
        @Field("updateTime")
        private Timestamp updateTime;
        
        @Override
        public String toString() {
            return "Good [id=" + id + ", number=" + number + ", name=" + name + ", updateTime=" + updateTime + "]";
        }
        
        public Good(){}
        
        public Good(String id, int number, String name, Timestamp updateTime) {
            super();
            this.id = id;
            this.number = number;
            this.name = name;
            this.updateTime = updateTime;
        }
         
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public int getNumber() {
            return number;
        }
        public void setNumber(int number) {
            this.number = number;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Timestamp getUpdateTime() {
            return updateTime;
        }
        public void setUpdateTime(Timestamp updateTime) {
            this.updateTime = updateTime;
        }
        
    }
    View Code

      每测试一次,可以在浏览器中通过query方式查看测试结果是否正确。

    12.参考资料

      Solr之搭建Solr6.0服务并从Mysql上导入数据

       Solr参考指南  可以下载

  • 相关阅读:
    Java: 数据类型
    数据结构是什么
    数据结构:进制转换
    数据结构:堆与栈
    class的写法
    Java:异常体系
    数据结构: 先进后出——堆栈
    tomcat:web容器
    Windows: Dos命令
    面向函数范式编程
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/5647896.html
Copyright © 2011-2022 走看看