一、准备环境

1、一台linux服务器(Centos7)
2、安装jdk8环境 

3、准备solr7.8安装包

二、安装(我这里使用的是solr自带的应用容器,也可以集成到tomcat)

1)从官网下载最新solr

wget http://mirrors.shuosc.org/apache/lucene/solr/7.4.0/solr-7.4.0.tgz

2)解压,安装

tar -zxvf solr-7.2.0.tgz

3)相关命令

bin/solr stop -all 		关闭solr服务
bin/solr start -force 		开启solr服务
bin/solr status			查看solr服务状态

三、使用solr

1、点击Core Admin

这里写图片描述

2、按照步骤去创建,然后点击确认会出现

这里写图片描述

3、这个错误是因为找不到对应的配置文件,进入server/solr/configsets/_default/直接把里面的conf 复制到 你新建的core中 你新建的core在server/solr目录下

命令如下: 
1、进入到server/solr/configsets/_default下

cd /usr/local/install/solr7.4.0/server/solr/configsets/_default/

2、然后复制到新建的test中

cp -r conf /usr/local/install/solr7.4.0/server/solr/test/

3、到这儿core已创建好,相应的操作可以去网上寻找,我在这就不详细说明

三、连接mysql数据库

1)首先处理jar

mysql-connector-java-x.x.x.jar    solr-dataimporthandler-extras-5.1.0.jar    solr-dataimporthandler-7.1.0.jar 

拷贝到 solr\server\solr-webapp\webapp\WEB-INF\lib 下

1)配置连接信息

找到你新建的 core 下的solrconfig.xml文件(solrconfig.xml 文件所在目录是: solr\server\solr\test\conf),打开找到第一个requestHandler,在他下面加入如下内容

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

再在你创建的core目录的conf下创建data-config.xml文件,内容如下

<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
    <dataSource type="JdbcDataSource"
                driver="com.mysql.jdbc.Driver"
                url="jdbc:mysql://192.168.1.105:3306/solr"
                user="root"
                password="root" />
    <document>
        <entity name="person" query="select * from user">
            <field column="ID" name="id" />
            <field column="name" name="name" />
            <field column="passward" name="passward" />
        </entity>
    </document>
</dataConfig>

        dataSource不多说,一看就明白,

        entity --代表数据库表,column--代表数据库表字段,name--代表solr中字段名

        (注意:创建这个文件的时候第一行不能有空格或者空行,否则报错)

在managed-schema文件中添加对应于数据库字段的field,建议在 solr 可视化界面操作。当然,一定要手动修改 managed-schema 文件也不是不可以,但是每次更改完需要重新加载 Core,或者粗暴一点直接重新启动solr也可以。那么,直接修改 managed-schema 文件的。到这里你应该能联系上数据库了,也可以导入数据了。

三、在java中的应用

 <dependency>
            <groupId>org.apache.solr</groupId>
            <artifactId>solr-solrj</artifactId>
            <version>5.3.1</version>
</dependency>
一个测试小例子:
package com.hzl.admin.api.test;

import com.hzl.admin.core.entity.User;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;

import java.io.IOException;
import java.util.List;

public class SolrTest {

    //指定solr服务器的地址
    private final static String SOLR_URL = "http://192.168.1.253:8983/solr/";

    /**
     * 创建SolrServer对象
     * <p>
     * 该对象有两个可以使用,都是线程安全的
     * 1、CommonsHttpSolrServer:启动web服务器使用的,通过http请求的
     * 2、 EmbeddedSolrServer:内嵌式的,导入solr的jar包就可以使用了
     * 3、solr 4.0之后好像添加了不少东西,其中CommonsHttpSolrServer这个类改名为HttpSolrClient
     *
     * @return
     */
    public HttpSolrClient createSolrServer() {
        HttpSolrClient solr = null;
        solr = new HttpSolrClient(SOLR_URL);
        return solr;
    }


    /**
     * 往索引库添加文档
     *
     * @throws IOException
     * @throws SolrServerException
     */
    public void addDoc() throws SolrServerException, IOException {
        //构造一篇文档
        SolrInputDocument document = new SolrInputDocument();
        //往doc中添加字段,在客户端这边添加的字段必须在服务端中有过定义
        document.addField("id", "8");
        document.addField("name", "周新星");
        document.addField("password", "646456");
        //获得一个solr服务端的请求,去提交  ,选择具体的某一个solr core
        HttpSolrClient solr = new HttpSolrClient(SOLR_URL + "test");
        solr.add(document);
        solr.commit();
        solr.close();
    }


    /**
     * 根据id从索引库删除文档
     */
    public void deleteDocumentById() throws Exception {
        //选择具体的某一个solr core
        HttpSolrClient server = new HttpSolrClient(SOLR_URL + "test");
        //删除文档
        server.deleteById("1");
        //删除所有的索引
        //solr.deleteByQuery("*:*");
        //提交修改
        server.commit();
        server.close();
    }

    /**
     * 查询
     *
     * @throws Exception
     */
    public void querySolr() throws Exception {
        HttpSolrClient solrServer = new HttpSolrClient(SOLR_URL + "test/");
        SolrQuery query = new SolrQuery();
        // 下面设置solr查询参数
        // 参数q  查询所有
        // query.set("q", "*:*");
        // 相关查询,比如某条数据某个字段含有周、星、驰三个字  将会查询出来 ,这个作用适用于联想查询
         query.set("q", "name:ha~ OR password:ha~");

        // 参数fq, 给query增加过滤查询条件
        // id为0-4
        query.addFilterQuery("id:[32 TO 65]");

        // 给query增加布尔过滤条件
        // query.addFilterQuery("description:演员");  // description字段中含有“演员”两字的数据

        // 参数df,给query设置默认搜索域
        query.set("df", "name");

        // 参数sort,设置返回结果的排序规则
        query.setSort("id", SolrQuery.ORDER.desc);

        // 设置分页参数
        query.setStart(0);
        // 每一页多少值
        query.setRows(10);

        // 参数hl,设置高亮
        query.setHighlight(true);
        // 设置高亮的字段
        query.addHighlightField("name");
        // 设置高亮的样式
        query.setHighlightSimplePre("<font color='red'>");
        query.setHighlightSimplePost("</font>");

        // 获取查询结果
        QueryResponse response = solrServer.query(query);
        // 两种结果获取:得到文档集合或者实体对象

        // 查询得到文档的集合
        SolrDocumentList solrDocumentList = response.getResults();
        System.out.println("通过文档集合获取查询的结果");
        System.out.println("查询结果的总数量:" + solrDocumentList.getNumFound());
        // 遍历列表
        for (SolrDocument doc : solrDocumentList) {
            System.out.println("id:" + doc.get("id") + "   name:" + doc.get("name") + "    password:" + doc.get("password"));
        }

        // 得到实体对象
        List<User> tmpLists = response.getBeans(User.class);
        if (tmpLists != null && tmpLists.size() > 0) {
            System.out.println("通过文档集合获取查询的结果");
            for (User per : tmpLists) {
                System.out.println("id:" + per.getId() + "   name:" + per.getUserName() + "    password:" + per.getPassword());
            }
        }
    }

    public static void main(String[] args) throws Exception {
        SolrTest solr = new SolrTest();
        //solr.createSolrServer();
//        solr.addDoc();
//        solr.deleteDocumentById();
        solr.querySolr();
    }

}

到这里,你应该有点兴奋了,经过努力实现了简单运用solr。后续考虑在tomcat运行,实现定时增量导入,以及在java中更详尽的应用。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐