本文为转载链接:如有侵权:即删
原文作者: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分词器
- 第一步 放入jar
- 第二步 配置文件managed-schema
- 第三步 将停用词典和扩展词典和指定位置的文件放入到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);
}
}
}