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
    评论
1 概述 4 1.1 企业搜索引擎方案选型 4 1.2 Solr的特性 4 1.2.1 Solr使用Lucene并且进行了扩展 4 1.2.2 Schema(模式) 5 1.2.3 查询 5 1.2.4 核心 5 1.2.5 缓存 5 1.2.6 复制 6 1.2.7 管理接口 6 1.3 Solr服务原理 6 1.3.1 索引 6 1.3.2 搜索 7 1.4 源码结构 8 1.4.1 目录结构说明 8 1.4.2 Solr home说明 9 1.4.3 solr的各包的说明 10 1.5 版本说明 11 1.5.1 1.3版本 11 1.5.2 1.4版本 12 1.6 分布式和复制 Solr 架构 13 2 Solr的安装与配置 13 2.1 在Tomcat下Solr安装 13 2.1.1 安装准备 13 2.1.2 安装过程 14 2.1.3 验证安装 15 2.2 中文分词配置 15 2.2.1 mmseg4j 15 2.2.2 paoding 19 2.3 多核(MultiCore)配置 22 2.3.1 MultiCore的配置方法 22 2.3.2 为何使用多core ? 23 2.4 配置文件说明 23 2.4.1 schema.xml 24 2.4.2 solrconfig.xml 25 3 Solr的应用 29 3.1 SOLR应用概述 29 3.1.1 Solr的应用模式 29 3.1.2 SOLR使用过程说明 30 3.2 一个简单的例子 30 3.2.1 Solr Schema 设计 30 3.2.2 构建索引 30 3.2.3 搜索测试 31 3.3 搜索引擎的规划设计 32 3.3.1 定义业务模型 32 3.3.2 定制索引服务 34 3.3.3 定制搜索服务 34 3.4 搜索引擎配置 34 3.4.1 Solr Schema 设计(如何定制索引的结构?) 34 3.5 如何进行索引操作? 36 3.5.1 基本索引操作 36 3.5.2 批量索引操作 37 3.6 如何进行搜索 39 3.6.1 搜索语法 39 3.6.2 排序 42 3.6.3 字段增加权重 42 3.6.4 Solr分词器、过滤器、分析器 42 3.6.5 Solr高亮使用 46 4 SolrJ的用法 46 4.1 搜索接口的调用实例 46 4.2 Solrj的使用说明 47 4.2.1 Adding Data to Solr 47 4.2.2 Directly adding POJOs to Solr 49 4.2.3 Reading Data from Solr 51 4.3 创建查询 51 4.4 使用 SolrJ 创建索引 52 4.5 Solrj包的结构说明 53 4.5.1 CommonsHttpSolrServer 53 4.5.2 Setting XMLResponseParser 53 4.5.3 Changing other Connection Settings 53 4.5.4 EmbeddedSolrServer 54 5 Solr的实际应用测试报告 54 5.1 线下压力测试报告 54 5.2 线上环境运行报告 54 6 solr性能调优 55 6.1 Schema Design Considerations 55 6.1.1 indexed fields 55 6.1.2 stored fields 55 6.2 Configuration Considerations 55 6.2.1 mergeFactor 55 6.2.2 mergeFactor Tradeoffs 56 6.3 Cache autoWarm Count Considerations 56 6.4 Cache hit rate(缓存命中率) 56 6.5 Explicit Warming of Sort Fields 56 6.6 Optimization Considerations 56 6.7 Updates and Commit Frequency Tradeoffs 56 6.8 Query Response Compression 57 6.9 Embedded vs HTTP Post 57 6.10 RAM Usage Considerations(内存方面的考虑) 57 6.10.1 OutOfMemoryErrors 57 6.10.2 Memory allocated to the Java VM 57 7 FAQ 58 7.1 出现乱码或者查不到结果的排查方法: 58

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值