sorl6.0+jetty+mysql搭建solr服务

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 1.下载solr   官网:http://lucene.apache.org/solr/ 2.目录结构如下 3.启动solr(默认使用jetty部署)   在path路径下将 bin文件夹对应的目录加入,然后输入 solr start(或者 solr start -p port,指定端口启动)。

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参考指南  可以下载

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
Web App开发 Java 应用服务中间件
idea/eclipse下Maven工程集成web服务(tomcat、jetty)
idea/eclipse下Maven工程集成web服务 转载请注明出处:http://www.cnblogs.com/funnyzpc/p/8093554.html     应用服务器最常用的一般有这哥仨:tomcat、jetty、webLogic ,前两者开源属轻量级应用服务器,适用于一般项目开...
1883 0
|
Web App开发 应用服务中间件 Apache
Web服务(Apache、Nginx、Tomcat、Jetty)与应用(LAMP、CMS-WordPress&Ghost、Jenkins、Gitlab)
Web服务和应用是目前信息技术领域的热门技术。如何使用Docker来运行常见的Web服务器(包括Apache、Nginx、Tomcat等),以及一些常用应用(LAMP、CMS等)。包括具体的镜像构建方法与使用步骤。
2232 0
|
监控 搜索推荐 应用服务中间件
搜索服务solr 一二事(1) - solr-5.5 使用自带Jetty或者tomcat 搭建单机版搜索服务器
solr,什么是solr,就是你要吃的东西“馊了”,不能吃了,out of date~ 嘛。。。开个玩笑,发音就是‘搜了’,专门用于搜索的一个开源框架,lunce就不说了,不好用,麻烦 来讲讲solr吧 目前最新更新的是6.0,4月7-8号更新的,哥不太喜欢用新出来的版本,多多少少会有bug,centos7出来后我至今使用的是6.5(实在无法忍受7啊。
994 0
|
缓存 分布式计算 API
Spark Netty与Jetty (源码阅读十一)
  spark呢,对Netty API又做了一层封装,那么Netty是什么呢~是个鬼。它基于NIO的服务端客户端框架,具体不再说了,下面开始。   创建了一个线程工厂,生成的线程都给定一个前缀名。      像一般的netty框架一样,创建Netty的EventLoopGroup:      在常用...
1068 0