solr在linux下的安装使用手册

了解

按照原有模式:web浏览器—>web服务器—>数据库(可以通过各个字段搜索 模糊匹配 like)(效率极低)—>提升效率—>web服务器—>solr服务 。

在这里插入图片描述

下载地址: https://www.apache.org/dyn/closer.lua/lucene/solr/8.5.0/solr-8.5.0.tgz

目录结构
目录结构
bin:solr的运行脚本
contrib:solr的一些软件/插件,用于增强solr的功能。
dist:该目录包含build过程中产生的war和jar文件,以及相关的依赖文件。
docs:solr的API文档
example:solr工程的例子目录:
server:solr 运行的 war 文件和core
licenses:solr相关的一些许可信息

安装

安装前你的linux中要有jdk。因为我的已经有的所以直接安装
上传后解压

tar -zxvf 压缩包.tgz 

启动solr服务
切换到bin目录

cd /usr/local/solr-8.5.0/bin

启动服务:

./solr start -force

停止服务:

./solr stop -all

在外部访问

启动时遇到的问题

问题1
1024

解决方案:在linux系统中,当安装如elasticsearch、solr等应用时,linux系统会提示各种因各种限制
而导致安装失败
1、查看系统所有限制
命令: ulimit -a
解决:
a)先切换到root账号(注意,若没切换,操作是不成功的);
b)以root身份修改/etc/security/limits.conf文件,在最后添加

* hard nofile 65000
* soft nofile 65000

c)以root身份修改/etc/security/limits.conf文件,在最后添加

* hard nproc 65000
* soft nproc 65000

修改完启动还会有一个问题

  • [WARN] * Your Max Processes Limit is currently 3806. It
    should be set to 65000 to avoid opera

解决:
将/usr/solr-8.5.0/bin/solr.in.sh文件中,SOLR_ULIMIT_CHECKS设置为false,消除WARN

/# Settings for common system values that may cause operational imparement when system defaults are used.
/ # Solr can use many processes and many file handles. On modern operating systems the savings by leaving
/ # these settings low is minuscule, while the consequence can be Solr instability. To turn these checks off, set
/ # SOLR_ULIMIT_CHECKS=false either here or as part of your profile.
/ # Different limits can be set in solr.in.sh or your profile if you prefer as well.
/ #SOLR_RECOMMENDED_OPEN_FILES=
#SOLR_RECOMMENDED_MAX_PROCESSES=
SOLR_ULIMIT_CHECKS=false

然后启动就启动成功

使用

创建solr实例 core

创建solr core
注1:solr会在解压目录下的server/solr目录中自动创建与命名相同的文件夹
注2: 但创建会报错, 因为缺少必要的配置文件. 需要在解压目录下的server/solr/configsets/_default目录中复制conf文件夹, 并粘贴到刚刚创建的文件夹中. 然后重新点击add core.
在这里插入图片描述
选中创建好的core,点击schema——add field添加属性到core
在这里插入图片描述
solr数据库没有表的概念,不依赖于类,而独立存在,可以创建属性,所以数据添加的时候可以根据需要创建
在这里插入图片描述
因为没有表和类,不需要同名属性,所以命名为表名_属性名,这样就可以知道如何对标哪个表

选择documents,在document type中选择document builder,然后选择需要添加的属性,并且赋值,所有属性设置完毕后,点击submit添加
在这里插入图片描述
属性的添加时独立的,不需要考虑是哪个表

在这里插入图片描述
选择query,并设置相关查询要求进行查询
在这里插入图片描述

(中文)分词查询

进入需要设置中文分词的core的conf文件夹,变价solrconfig.xml文件,添加如下内容

<lib dir="${solr.install.dir:../../../..}/contrib/analysis-extras/lucene-libs" regex="lucene-analyzers-smartcn-\d.*\.jar" />

在这里插入图片描述

编辑同文件夹中的managed-schema文件,添加内容如下
添加一个属性和分词定义
在这里插入图片描述
重启solr服务器solr.cmd stop -p 8983
启动solr.cmd start
在schema里添加一个file
在这里插入图片描述
选中刚刚添加进去的类型

在这里插入图片描述
可以去analysis进行测试
按照字符串进行匹配
在这里插入图片描述
按照自定义的类型匹配
在这里插入图片描述

数据导入

编辑solrconfig.xml文件,添加如下内容

<lib dir="${solr.install.dir:../../../..}/dist" regex="solr-dataimporthandler-\d.*\.jar" />
<lib dir="${solr.install.dir:../../../..}/dist" regex="solr-dataimporthandler-extras-\d.*\.jar" />

在这里插入图片描述
将需要使用的数据库jdbc jar包添加到解压目录的server\solr-webapp\webapp\WEB-INF\lib
版本不重要
在这里插入图片描述
编辑solrconfig.xml文件,添加如下内容

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

在同目录下,添加data-config.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
	<dataSource type="JdbcDataSource" name="userSource"
		driver="com.mysql.jdbc.Driver" 
		url="jdbc:mysql://localhost:3306/solr" 
		user="root" password="111111"/>
	<document>
		<entity name="user"  pk="u_id" dataSource="userSource"
			query="SELECT u_id,u_userName,u_password,u_content FROM t_user ">
			<field column="u_id" name="user_id"/>
			<field column="u_userName" name="user_userName"/>
			<field column="u_password" name="user_password"/>
			<field column="u_content" name="user_content"/>
		</entity>
	</document>
</dataConfig>

配置至少两个节点
datasource是源数据节点,原则上讲可以配置多个DataSource去连接多个数据库
document对应solr创建的数据,里面是对应的实体类配置
pk是主键,字段对应属性
5、在solr服务器中添加所有必要的属性
6、重启服务器,选择dataimport——execute导入数据库文件
打开MySQL
创建一个简单的数据库
在这里插入图片描述
重启solr服务器-execute
在这里插入图片描述
再次refresh就可以看到数据导入了
在这里插入图片描述

代码实操

创建项目,添加依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.szxs</groupId>
    <artifactId>SolrDemo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.solr/solr-solrj -->
        <dependency>
            <groupId>org.apache.solr</groupId>
            <artifactId>solr-solrj</artifactId>
            <version>7.3.1</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.7</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.3</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.9</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>

注释

import org.apache.solr.client.solrj.beans.Field;

public class Product {
    @Field("product_id")
    private int product_id;

    @Field
    private String product_name;

    @Field
    private double product_price;

    @Field
    private String product_desc;

    public Product() {
    }

    public Product(int product_id, String product_name, double product_price, String product_desc) {
        this.product_id = product_id;
        this.product_name = product_name;
        this.product_price = product_price;
        this.product_desc = product_desc;
    }

    public int getProduct_id() {
        return product_id;
    }

    public void setProduct_id(int product_id) {
        this.product_id = product_id;
    }

    public String getProduct_name() {
        return product_name;
    }

    public void setProduct_name(String product_name) {
        this.product_name = product_name;
    }

    public double getProduct_price() {
        return product_price;
    }

    public void setProduct_price(double product_price) {
        this.product_price = product_price;
    }

    public String getProduct_desc() {
        return product_desc;
    }

    public void setProduct_desc(String product_desc) {
        this.product_desc = product_desc;
    }
}


应用

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.Arrays;
import java.util.List;

public class SolrTest {
    //指定solr服务器的地址
    private final static String SOLR_URL = "http://localhost:8983/solr/user_core";

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

    /**
     * 往索引库添加文档
     * @throws IOException
     * @throws SolrServerException
     */
    public void addDoc() throws SolrServerException, IOException{
        //构造一篇文档(对象)
        SolrInputDocument document = new SolrInputDocument();
        //往doc中添加字段,在客户端这边添加的字段必须在服务端中有过定义
        document.addField("product_id", "100");
        document.addField("product_name", "小白菜");
        document.addField("product_price", "99.8");
        document.addField("product_desc", "我就是一颗小白菜,长也长不大");
        //获得一个solr服务端的请求,去提交  ,选择具体的某一个solr core
        HttpSolrClient solr = new HttpSolrClient.Builder(SOLR_URL ).build();
        solr.add(document);
        solr.commit();
        solr.close();
    }

    public void addDoc(Product product) throws SolrServerException, IOException{
        //构造一篇文档(对象)
        SolrInputDocument document = new SolrInputDocument();
        //往doc中添加字段,在客户端这边添加的字段必须在服务端中有过定义
        document.addField("product_id", product.getProduct_id());
        document.addField("product_name", product.getProduct_name());
        document.addField("product_price", product.getProduct_price());
        document.addField("product_desc", product.getProduct_desc());
        //获得一个solr服务端的请求,去提交  ,选择具体的某一个solr core
        HttpSolrClient solr = new HttpSolrClient.Builder(SOLR_URL ).build();
        solr.add(document);
        solr.commit();
        solr.close();
    }

    /**
     * 根据id从索引库删除文档
     */
    public void deleteDocumentById() throws Exception {
        //选择具体的某一个solr core
        HttpSolrClient server = new HttpSolrClient.Builder(SOLR_URL ).build();
        //删除文档
        //server.deleteById("036cd386-fbb0-4dde-8c47-f580b938538e");
        server.deleteByQuery("product_id:100");
        //删除所有的索引
        //solr.deleteByQuery("*:*");
        //提交修改
        server.commit();
        server.close();
    }

    /**
     * 查询
     * @throws Exception
     */
    public void querySolr() throws Exception{
        HttpSolrClient solrServer = new HttpSolrClient.Builder(SOLR_URL ).build();
        SolrQuery query = new SolrQuery("*:*");
        //下面设置solr查询参数
//        query.set("q", "*:*");// 参数q  查询所有
        query.set("q", "product_desc:白菜");
//        query.set("q","白菜");//相关查询,比如某条数据某个字段含有周、星、驰三个字  将会查询出来 ,这个作用适用于联想查询
        //参数fq, 给query增加过滤查询条件
//        query.addFilterQuery("product_id:[100 TO 500]");//id为0-5
//        query.addFilterQuery("product_price:[50 TO *]");//
//        query.addFilterQuery("product_price:[* TO 90]");//
        //给query增加布尔过滤条件
//        query.addFilterQuery("product_desc:白菜");  //
        //参数df,给query设置默认搜索域
//        query.set("df", "product_name");
        //参数sort,设置返回结果的排序规则
//        query.setSort("product_id",SolrQuery.ORDER.desc);
        //设置分页参数
//        query.setStart(1);
//        query.setRows(1);//每一页多少值
        //参数hl,设置高亮
//        query.setHighlight(true);
//        //设置高亮的字段
//        query.addHighlightField("product_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("product_id")+"   name:"+doc.get("product_name")+"    description:"+doc.get("product_desc"));
//        }

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

    public static void main(String[] args) throws Exception {
        SolrTest solr = new SolrTest();
        solr.createSolrServer();
//        solr.addDoc();
//        solr.addDoc(new Product(1001, "大白菜",
//                48.8, "我是一颗大白菜,再长也长不大"));
        solr.deleteDocumentById();
//        solr.querySolr();
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值