solr使用教程

Solr基础信息

  • 简介
    • 基于Apache Lucene(全文检索工具库)构建的用于搜索和分析的开源解决方案。可提供可扩展索引、搜索功能、高亮显示和文字解析功能。
    • 本质是java Web项目,内嵌Jetty服务器,所以安装起来非常方便。客户端操作solr的过程和平时我们所写的项目一样,就是请求Solr中的控制器,处理完数据后把结果响应给客户端
  • 正向索引和反向索引
    • 正向索引,从文档到词组的过程。每次搜索的时候需要搜索所有文档,每个文档比较搜索条件和词组
  • 单机版本安装(官网比较详细:https://solr.apache.org/)
  • 启动:
    • 如果是root用户启动:需要修改solr_in.sh SOLR_ULIMIT_CHECKS=false
    • ./solr start (root用户)-force
  • collection、core、replica、core
    • 由多个cores组成一个逻辑索引叫做一个collection。一个collection本质上是一个可以跨越多个核的索引,同时包含冗余索引。
    • collection由不同的shard组成,每个shard又多个replica,每个shard中有一个leadereplica,每个replica是一个物理索引,所以一个replica对应一个core
    • 在单节点的solr上,一个core等于一个collection。
    • 在solrCloud上,一个collection由分布在不同节点的core组成,但是一个collection仍然为一个逻辑索引,但是这个colletion由不同的core包含不同的shards组成。
    • 一个core包含不同封装一个物理索引形成一个实例。
    • 一个collection是由分布在不同node上的core组合而成,从而提供一个逻辑索引组成的。
    • 一个core主要是一个文档集中text和field的索引。一个solr实例可以包含多个core,每个core根据本地一定的标准互相分开。它去提供结不同的搜索接口给用户,或者提供权限让不同用户有不同权限去访问不同文档。
    • collection由一个或者多个shard组成,一个shard包含一个或者多个replica ,一个replica是一个core

单机版安装

字段描述

  • fieldType
    • 定义一个属性类型,在solr中属性类型都是自定义的。
  • field
    • 表示向Document中添加一个属性
    • 常用的属性:name 属性名 type 类型
  • uniqueKey
    • 唯一主键,Solr中默认定义id属性为唯一主键。ID的值是不允许重复的
  • dynamicField
    • 名称中允许*进行通配。代表满足特定名称要求的一组属性

新增数据

在core中的documents中选择update xml

输入:

<doc>
<field name ="id">1</field>
<field name ="zh_all">中华人名共和国国歌</field>
<field name ="zh_smart">中华人名共和国国歌</field>
</doc>

数据导入

需要修改的文件 managed-schema solrconfig.xml

managed-schema

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

solrconfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
	<dataSource type="JdbcDataSource"
                driver="com.mysql.cj.jdbc.Driver"
                url="jdbc:mysql://xxxxxxx:3306/xdclass_product?useUnicode=true&amp;characterEncoding=utf8&amp;zeroDateTimeBehavior=convertToNull&amp;useSSL=true&amp;serverTimezone=GMT%2B8"
                user="root"
                password="xxxxxx">
    </dataSource>
    <document>
    	<entity name="abc" query="select id,title from product">
            <field column="id" name="id"></field>
            <field column="title" name="zh_all"></field>
        </entity>
    </document>
</dataConfig>

cp /usr/local/solr/dist/solr-dataimporthandler-* /usr/local/solr/server/solr-webapp/webapp/WEB-INF/lib/

基本安装步骤

#减少启动时的警告信息
cd /usr/local/solr/bin
vi solr.in.sh
SOLR_ULIMIT_CHECKS=false
#启动
./solr start -force
端口8983
#控制台
http://ip:8983
#创建core
cd /usr/local/solr/server/solr
cp configsets/_default/conf/ xxxxx/ -r
#在控制台新增core xxxx
#安装中文的分析器
#以下为maven仓库位置,自行去下载
<dependency>
    <groupId>com.github.magese</groupId>
    <artifactId>ik-analyzer</artifactId>
    <version>8.2.0</version>
</dependency>
将该jar包放置/usr/local/solr/server/solr-webapp/webapp/WEB-INF/lib
然后到需要安装中文分析器的core目录下修改managed-schema文件
在根标记<schema>的第一层开始写
    <field name="zh_all" type="text_zh_all" indexed="true" stored="true" />
    <field name="zh_smart" type="text_zh_smart" indexed="true" stored="true" />
    <fieldType name="text_zh_all" class="solr.TextField">
        <analyzer type="index">
            <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
    </fieldType>

    <fieldType name="text_zh_smart" class="solr.TextField">
        <analyzer type="index">
            <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
    </fieldType>
#停止solr
/usr/local/solr/bin/solr stop -all

使用SolrJ操作Solr

依赖:

        <dependency>
            <groupId>org.apache.solr</groupId>
            <artifactId>solr-solrj</artifactId>
            <version>8.2.0</version>
        </dependency>

基本操作:

package com.example.solrdemo.solrj;

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.request.UpdateRequest;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.util.NamedList;

import java.io.IOException;
import java.util.Iterator;

public class Test {
    public static void main(String[] args) {
        query();
    }

    public static void query(){
        HttpSolrClient client = new HttpSolrClient.Builder("http://xxxxxx:8983/solr/xxxx").build();
        SolrQuery solrQuery = new SolrQuery();
        solrQuery.setSort("id",SolrQuery.ORDER.desc);
        solrQuery.setQuery("zh_all:技术");
        QueryResponse response;
        try {
            response = client.query(solrQuery);
            System.out.println(response.getResults());
            //响应头
            NamedList<Object> namedList = response.getHeader();
            Iterator iterator = namedList.iterator();
            while(iterator.hasNext()){
                System.out.println(iterator.next());
            }
            SolrDocumentList documentList = response.getResults();
            System.out.println("总计数据行数"+documentList.getNumFound());
            for(SolrDocument solrDocument:documentList){
                
                System.out.print("id = "+solrDocument.get("id"));
                System.out.println("; zh_all = "+solrDocument.get("zh_all"));
            }
            //
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void delete(){
        HttpSolrClient client = new HttpSolrClient.Builder("http://xxxxxxx:8983/solr/xxxx").build();
        try {
            client.deleteById("007");
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
            try {
                client.rollback();
            } catch (SolrServerException ex) {
                ex.printStackTrace();
            } catch (IOException ex) {
                ex.printStackTrace();
            }

        }
        try {
            client.commit();
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //包括新增和更新。 主键一致-更新。主键不存在-新增
    public static void update(){
        HttpSolrClient client = new HttpSolrClient.Builder("http://xxxxx:8983/solr/xxxx").build();
        //新增或更新。新增文档类型都是SolrInputDocument
        SolrInputDocument doc = new SolrInputDocument();
        doc.addField("id","007");
        doc.addField("zh_all","测试SolrJ新增数据");
        try {
            UpdateResponse response = client.add(doc);
            System.out.println(String.format("status = %s ; QTime = %s",response.getStatus(),response.getQTime()));
        } catch (Exception e) {
            e.printStackTrace();
            try {
                client.rollback();
            } catch (SolrServerException ex) {
                ex.printStackTrace();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            return ;
        }
        //在Solr服务中,数据的写操作也是有事务的,WEB管理平台默认一次操作一次提交。
        try {
            client.commit();
            client.close();
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用Spring data Solr

依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-solr</artifactId>
            <version>2.3.2.RELEASE</version>
        </dependency>

application.properties

#spring data框架定义的访问地址,不能提供索引库定义。
#spring data是直接连接数据源的,可以根据索引库命名访问任意索引库,实现数据访问。
#如果solr是一个集群,则提供zk访问地址。Solr集群称solr cloud,是通过zk搭建的。
spring.data.solr.host=http://xxxx:8983/solr
#spring.data.solr.zk-host=xxx

测试:

    @Autowired
    private SolrTemplate solrTemplate;

    @Test
    public void testQuery(){
        Criteria criteria = Criteria.where("zh_all").is("技术");
        Query query = Query.query(criteria);
        ScoredPage<FirstSolrPojo> solrPojos = solrTemplate.queryForPage("bjsxt",query,FirstSolrPojo.class);
        System.out.println(solrPojos.getContent());
    }

    @Test
    public void testUpdate(){

//        solrTemplate.saveDocument(String collectionName,SolrInputDocument doc);
//        solrTemplate.saveDocuments(String collectionName,List<SolrInputDocument> docs);
//        solrTemplate.saveBean(String collectionName,Object bean);
//        solrTemplate.saveBeans(String collectionName,List<Object> beans);
        FirstSolrPojo pojo = new FirstSolrPojo();
        pojo.setId("100");
        pojo.setZh_all("测试SpringData保存数据1");
        FirstSolrPojo pojo1 = new FirstSolrPojo();
        pojo1.setId("101");
        pojo1.setZh_all("测试SpringData保存数据2");
        FirstSolrPojo pojo2 = new FirstSolrPojo();
        pojo2.setId("102");
        pojo2.setZh_all("测试SpringData保存数据3");
        List<FirstSolrPojo> list = new ArrayList<>();
        list.add(pojo);
        list.add(pojo1);
        list.add(pojo2);
        solrTemplate.saveBeans("bjsxt",list);
        solrTemplate.commit("bjsxt");
    }
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Solr是一个强大的开源搜索平台,可以用于构建高性能、可扩展的搜索应用程序。安装Solr可以通过Docker进行,以下是安装Solr教程: 1. 首先,使用docker命令搜索可用的Solr镜像版本,可以通过以下命令查看可用的Solr版本: ``` docker search solr ``` 2. 选择一个适合的Solr版本,假设我们选择的版本是8.11.1,使用以下命令拉取对应版本的Solr镜像: ``` docker pull solr:8.11.1 ``` 3. 准备一个包含Dockerfile和docker-compose.yml脚本的文件夹,用于构建含中文分词器的新的Solr镜像。确保文件夹中包含了所需的中文分词器ik-analyzer-8.5.0.jar以及所有扩展词和停用词相关的配置文件。 4. 在文件夹中创建docker-compose.yml文件,内容如下: ``` version: '3' services: solr: image: solr:8.11.1 ports: - 8983:8983 volumes: - ./solr/conf:/opt/solr/server/solr/mycores/conf - ./solr/data:/opt/solr/server/solr/mycores/data - ./solr/logs:/opt/solr/server/logs environment: - SOLR_CORE=mycore command: solr-precreate mycore ``` 5. 在文件夹中创建Dockerfile文件,内容如下: ``` FROM solr:8.11.1 COPY ./ik-analyzer-8.5.0.jar /opt/solr/server/solr-webapp/webapp/WEB-INF/lib/ COPY ./ext_dict/* /opt/solr/server/solr-webapp/webapp/WEB-INF/classes/ext_dict/ COPY ./stopwords/* /opt/solr/server/solr-webapp/webapp/WEB-INF/classes/stopwords/ ``` 6. 打开终端,进入到保存有Dockerfile和docker-compose.yml的文件夹,执行以下命令构建并启动Solr容器: ``` docker-compose up -d ``` 7. 等待一段时间,Solr容器将会启动并监听端口8983。访问http://localhost:8983即可进入Solr的管理界面。 以上就是使用Docker安装Solr教程。如果有任何疑问,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值