solr入门教程

本文为转载链接:如有侵权:即删
原文作者:Solr 7.5.0 windows单机版

源码地址:

链接:https://pan.baidu.com/s/1BD6AWQvB7E1hDuLRWWPduw 
提取码:1np2

第一节:下载solr 和 第二节:解压、启动、访问solr

下载启动该教程

三:使用命令添加/删除 core

create创建

● solr create -c name

delete删除

● solr delete -c name

示例:创建名为 name 的core,并访问这个core

  • 创建
    在这里插入图片描述
  • 查看 路径:solr-7.5.0\server\solr
    -
  • 访问
    在这里插入图片描述

四:core的配置文件介绍

路径:solr-7.5.0\server\solr\name\conf

下图中标红的两个文件是最重要的两个配置文件
在这里插入图片描述
solrconfig.xml详解
managed-schema详解

-------------------------------------------------------------start---------------------------------------------------------------------------
Schema API 操作managed-schema配置文件(添加配置)-也可以手动配置
(本步骤是用于添加数据库字段在配置managed-schema文件没有的)
准备工具 Postman 地址:Postman 下载
在这里插入图片描述

  • Schema API 操作managed-schema配置文件(删除配置)
{
  "add-field":{
        "name":"time",
        "type":"pdate",
        "indexed":true,
        "stored":true}
}
  • Schema API 操作managed-schema配置文件(删除配置)
{
  "delete-field":{
        "name":"time"}
}

在这里插入图片描述
-------------------------------------------------------------end-----------------------------------------------------------------------------
四-1:复制demo信息
D:\solr\solr-7.5.0\example\example-DIH\solr\solr\conf路径下的全部文件复制
在这里插入图片描述
D:\solr\solr-7.5.0\server\solr\name\conf
在这里插入图片描述

五:IK分词器

  1. 第一步 放入jar
  2. 第二步 配置文件managed-schema
  3. 第三步 将停用词典和扩展词典和指定位置的文件放入到D:\solr\solr-7.5.0\server\solr-webapp\webapp\WEB-INF下的classes(没有就创建一个)

下载地址

链接:https://pan.baidu.com/s/1qrQPsZXofBkiucAQInU7Pw 
提取码:i04a 
  • 将 ik-analyzer-solr7-7.x.jar 放入 solr-7.5.0\server\solr-webapp\webapp\WEB-INF\lib 目录下
    在这里插入图片描述
  • 配置managed-schema
    配置一:(任选其一)
<!-- 定义ik分词器 -->
<fieldType name="text_ik" class="solr.TextField">
  <analyzer type="index">
      <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false"/>
      <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
      <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true"/>
      <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

在这里插入图片描述
配置二:(任选其一)

<!-- IKAnalyzer -->
		<fieldType name="text_ik" class="solr.TextField">       
			<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> 
		</fieldType>
		<!-- IKAnalyzer Field -->
		<field name="title_ik" type="text_ik" indexed="true" stored="true" />
		<field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true" />
  • 重启Solr solr restart -p 8983
    在这里插入图片描述
    在这里插入图片描述
    定义 ik分词器的 拓展/停用 词典
同义词:搜索结果里出现的同义词。如我们输入”还行”,得到的结果包括同义词”还可以”。

停止词:在搜索时不用出现在结果里的词。比如is 、a 、are 、”的”,“得”,“我” 等,
这些词会在句子中多次出现却无意义,所以在分词的时候需要把这些词过滤掉。

扩展词:在搜索结果里额外出现的词。扩展词只能是你输入词的本身或子串。比如我们 输入”重庆开县人”,
正常分词得到的结果是“重庆” “开县”“人”;当我们在扩展词里加入“重庆开县”时,
分词的结果是“重庆开县”“重庆” “开县”“人”。
  • 1.在 solr-7.5.0\server\solr-webapp\webapp\WEB-INF 新建classes目录
    在这里插入图片描述
  • 2.在classes新建三个文件
ext.dic   
IKAnalyzer.cfg.xml
stopword.dic

在这里插入图片描述

  • 3.编辑文件内容
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">  
<properties>  
	<comment>IK Analyzer 扩展配置</comment>
	<!--用户可以在这里配置自己的扩展字典--> 
	<entry key="ext_dict">ext.dic;</entry> 
	
	<!--用户可以在这里配置自己的扩展停止词字典-->
	<entry key="ext_stopwords">stopword.dic;</entry> 
	
</properties>
  • 重启solr

在这里插入图片描述

第六节:从数据库导入数据到solr

第七节:使用solrj操作solr

步骤:

1.引入依赖
2.编写User实体类
3.测试CRUD-增删改查

1.引入依赖

<!-- solrj -->
        <dependency>
            <groupId>org.apache.solr</groupId>
            <artifactId>solr-solrj</artifactId>
            <version>7.5.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13-rc-1</version>
            <scope>test</scope>
        </dependency>


        <!-- json操作:jackson -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
        </dependency>
        <!--solr依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-solr</artifactId>
        </dependency>

2.编写User实体类

import org.apache.solr.client.solrj.beans.Field;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 
//jackSon注解:忽略未匹配到的字段
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
 
	public User(String id, String name) {
		super();
		this.id = id;
		this.name = name;
	}
 
	public User() {
		super();
	}
 
	// solr查询若直接将数据转为对象,需要指定Field,该值需要和managed-schema配置Field的name一致
	@Field("id")
	private String id;
 
	@Field("name")
	private String name;
 
	public String getId() {
		return id;
	}
 
	public void setId(String id) {
		this.id = id;
	}
 
	public String getName() {
		return name;
	}
 
	public void setName(String name) {
		this.name = name;
	}
 
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + "]";
	}
 
}

2-1.编写Service和dao实体类和UserMapper.xml

  • 编写Service
import com.example.springbootusersolr.model.User;
import java.util.List;
public  interface UserService {
    List<User> getUsers();
}
import com.example.springbootusersolr.dao.UserDao;
import com.example.springbootusersolr.model.User;
import com.example.springbootusersolr.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;
    @Override
    public List<User> getUsers() {
        List<User>  users=   userDao.selectUser();
        return users;
    }
}
  • 编写dao
import com.example.springbootusersolr.model.User;
import java.util.List;
public interface  UserDao{
    List<User> selectUser();
}
  • UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.springbootusersolr.dao.UserDao" >
  <resultMap id="BaseResultMap" type="com.example.springbootusersolr.model.User" >
    <id column="id" property="id" jdbcType="BIGINT" />
    <id column="name" property="name" jdbcType="STRING" />
  </resultMap>

  <select id="selectUser" resultMap="BaseResultMap" parameterType="com.example.springbootusersolr.model.User" >
      select
      *
      from user
  </select>

</mapper>

3.测试类CRUD-增删改查

package com.example.springbootusersolr;

import com.example.springbootusersolr.model.User;
import com.example.springbootusersolr.service.UserService;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;
import java.util.Map;

/**
 * @program: springboot-eureka-demo
 * @ClassName: SolrJCRUD
 * @version: 1.0
 * @description:
 * @author: zhaonian
 * @create: 2019-11-28 13:49
 **/
public class SolrJCRUD {
    private SolrClient solrClient;

    @Autowired
    UserService userService;

    /**
     * 初始化solrClient
     */
    @Before
    public void before() {
        solrClient = new HttpSolrClient.Builder(
                "http://localhost:8983/solr/name").build();
    }

    /**
     * 通过对象添加单条数据,若添加时id已存在,那么solr会执行修改操作
     */
    @Test
    public void addBean() throws Exception {

        User user = new User("6", "小美眉");

        solrClient.addBean(user);
        solrClient.commit();
    }

    /**
     * 批量添加 也就是第六节提到的方式一
     */
    @Test
    public void addBeans() throws Exception {

        // 从数据库查出所有的user,UserService操作数据库部分的代码省略
        List<User> users = userService.getUsers();

        // 添加
        solrClient.addBeans(users);
        solrClient.commit();
    }

    /**
     * 通过document添加单条数据
     */
    @Test
    public void addDocument() throws Exception {

        SolrInputDocument document = new SolrInputDocument();
        document.addField("id", "2");
        document.addField("name", "萝卜");

        solrClient.add(document);
        solrClient.commit();
    }

    /**
     * 两种删除方式
     */
    @Test
    public void deleteById() throws Exception {

        // 方式一:根据id删除
       // solrClient.deleteById("2");

        // 方式二:根据查询结构删除
        solrClient.deleteByQuery("name:萝卜");

        solrClient.commit();
    }

    /**
     * 查询
     */
    @Test
    public void query() throws Exception {

        // 构造搜索条件
        SolrQuery solrQuery = new SolrQuery();

        // 设置搜索关键词
        solrQuery.setQuery("name:萝");

        // 设置排序
        solrQuery.setSort("id", SolrQuery.ORDER.desc);

        // 设置分页信息
        solrQuery.setStart(0);
        solrQuery.setRows(2);

        // 设置高亮
        solrQuery.setHighlight(true); // 开启高亮组件
        solrQuery.addHighlightField("name");// 高亮字段
        solrQuery.setHighlightSimplePre("<em>");// 标记,高亮关键字前缀
        solrQuery.setHighlightSimplePost("</em>");// 后缀

        // 执行查询
        QueryResponse response = solrClient.query(solrQuery);

        // 获取查询结果
        List<User> users = response.getBeans(User.class);

        // 将高亮的标识写进对象的name字段上
        Map<String, Map<String, List<String>>> map = response.getHighlighting();
        for (Map.Entry<String, Map<String, List<String>>> highlighting : map
                .entrySet()) {
            for (User user : users) {
                if (!highlighting.getKey().equals(user.getId().toString())) {
                    continue;
                }
                user.setName(highlighting.getValue().get("name").toString());
                break;
            }
        }

        // 打印搜索结果
        for (User user : users) {
            System.out.println(user);
        }
    }

}

发布了182 篇原创文章 · 获赞 35 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_39505065/article/details/103280133
今日推荐