solr基本操作步骤

@TOC

1、solr基本操作

1.1、基本概念

Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化

  1. solr就是在lucene工具包的基础之上进行了封装,而且是以web服务的形式对外提供索引功能
  2. 业务系统需要使用到索引的功能(建索引,查索引)时,只要发出http请求,并将返回数据进行解析即可

什么情况下会使用solr
要查询的内容经常涉及多张表,优先把数据查了放入solr里面,之后就不需要经常去数据库里反复联表查询

1. 2、基本操作solr

  1. 下载地址:http://lucene.apache.org/solr/
  2. 解压压缩包。
  3. 进入解压目录下的bin目录,在此目录下打开命令行,输入命令solr.cmd start
    在这里插入图片描述
  4. 启动solr服务器,服务默认端口8983
    出现happy 即可
    和redis不一样,这个启动之后可以关掉
  5. 访问localhost:8983,进入solr界面在这里插入图片描述
  6. 创建solr core。
    注1:solr会在解压目录下的server/solr目录中自动创建与命名相同的文件夹
    注2: 但创建会报错, 因为缺少必要的配置文件. 需要在解压目录下的server/solr/configsets/_default目录中复制conf文件夹, 并粘贴到刚刚创建的文件夹中. 然后重新点击add core.
  7. 选择创建好的core, 点击schemaadd field添加属性到core
    在这里插入图片描述
    在这里插入图片描述
    添加add core会报错
    在这里插入图片描述
    6、选中创建好的core,点击schema——add field添加属性到core
    在这里插入图片描述
    solr数据库没有表的概念,不依赖于类,而独立存在,可以创建属性,所以数据添加的时候可以根据需要创建
    在这里插入图片描述
    因为没有表和类,不需要同名属性,所以命名为表名_属性名,这样就可以知道如何对标哪个表
    7、选择documents,在document type中选择document builder,然后选择需要添加的属性,并且赋值,所有属性设置完毕后,点击submit添加
    在这里插入图片描述
    属性的添加时独立的,不需要考虑是哪个表
    在这里插入图片描述
    8、选择query,并设置相关查询要求进行查询
    在这里插入图片描述
    必然是有的,ID永远不会重复

1 3、(中文)分词查询

1、进入需要设置中文分词的core的conf文件夹,变价solrconfig.xml文件,添加如下内容
在这里插入图片描述

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

在这里插入图片描述
2、编辑同文件夹中的managed-schema文件,添加内容如下
添加一个属性和分词定义

![在这里插入图片描述]在这里插入图片描述
3、重启solr服务器solr.cmd stop -p 8983
在这里插入图片描述
启动solr.cmd start
在这里插入图片描述
4、在schema里添加一个file

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

1.4数据导入

1、编辑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" />

在这里插入图片描述
2、将需要使用的数据库jdbc jar包添加到解压目录的server\solr-webapp\webapp\WEB-INF\lib
版本不重要
在这里插入图片描述

3、编辑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>

4、在同目录下,添加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就可以看到数据导入了
在这里插入图片描述

2、代码实操

2.1创建项目,添加依赖

<?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>

2.2、注释

在属性上添加@Field(“product_id”)

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;
    }
}

2.3、应用

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
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值