docker 安装 solr

教程网址:https://blog.csdn.net/liaomin416100569/article/details/77301756

一 、solr简介

solr是以lucene为内核开发的企业级搜索应用 应用程序可以通过http请求方式来提交索引,查询索引,提供了比lucene更丰富的查询语言,是一个高性能,高可用环境全文搜索引擎

二、核与文档的概念

核(core):是用于存储json格式的数据,等价于mysql中数据库的概念
文档:一个json对象就是一个文档 相同属性的json数组集合就是一个表

三、使用dokcer安装solr安装

这里下载 solr-5.5.5的镜像

[root@localhost ~]# docker pull solr:5.5.5

创建一个名为 solr 的的容器

[root@localhost ~]# docker run --name solr -id  -p 8983:8983 solr:5.5.5

在 solr 容器中使用 solr 账号创建一个名字是 core01 的核

[root@localhost ~]# docker exec -it --user=solr solr bin/solr create_core -c core01

创建完成后有以下提示

解释:
–user=solr:表示用solr这个账号去执行这个命令(solr是默认用户)
紧随其后的solr 指的是容器的名称solr
create_core -c core01:创建一个名字是core01的核(也可以认为是数据库的名字)
在这里插入图片描述

查看网页:ip:8983/solr/
ip:指linux系统宿主机的ip

在这里插入图片描述
Documents:表示在里面新增一些json数据
Query:表示查询,在没有分词的情况下相当于数据库里面的:键=值(全文字匹配)

四、配置中文分词器

默认solr 没有使用中文分词器 所有搜索的词 都是整个句子就是一个词 搜索时 将单词全部写入才能搜索或者使用* 需要配置中文分词器目前比较好用的分词器 是IK 2012年停更 只支持到 Lucene4.7 所有 solr5.5 需要lucene5支持 需要修改部分源码来支持solr5.5

打开开发者工具,建立一个maven项目
在这里插入图片描述
导入依赖

<dependencies>
	<dependency>
		<groupId>com.janeluo</groupId>
		<artifactId>ikanalyzer</artifactId>
		<version>2012_u6</version>
		<exclusions>
			<exclusion>
				<groupId>org.apache.lucene</groupId>
				<artifactId>lucene-core</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.apache.lucene</groupId>
				<artifactId>lucene-queryparser</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.apache.lucene</groupId>
				<artifactId>lucene-analyzers-common</artifactId>
			</exclusion>
		</exclusions>
	</dependency>
	<dependency>
		<groupId>org.apache.lucene</groupId>
		<artifactId>lucene-core</artifactId>
		<version>5.5.5</version>
	</dependency>
	<dependency>
		<groupId>org.apache.lucene</groupId>
		<artifactId>lucene-queryparser</artifactId>
		<version>5.5.5</version>
	</dependency>
	<dependency>
		<groupId>org.apache.lucene</groupId>
		<artifactId>lucene-analyzers-common</artifactId>
		<version>5.5.5</version>
	</dependency>
</dependencies>

重写ikanalyzer-2012_u6.jar 包中 org.wltea.analyzer.lucene 包下的 IKTokenizer 类与 IKAnalyzer
在这里插入图片描述

将重写的两个类进行修改
IKAnalyzer.java

package org.wltea.analyzer.lucene;


import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.Tokenizer;

/**
 * 使用高版本lucene重写 IKAnalyzer(createComponents方法) 和 IKTokenizer(IKTokenizer方法)
 */
public final class IKAnalyzer extends Analyzer {

    private boolean useSmart;

    public boolean useSmart() {
        return useSmart;
    }

    public void setUseSmart(boolean useSmart) {
        this.useSmart = useSmart;
    }

    public IKAnalyzer() {
        this(false);
    }

    public IKAnalyzer(boolean useSmart) {
        super();
        this.useSmart = useSmart;
    }

	/*
	//Lucene4.7.2
	@Override
	protected TokenStreamComponents createComponents(String fieldName, final Reader in) {
		Tokenizer _IKTokenizer = new IKTokenizer(in, this.useSmart());
		return new TokenStreamComponents(_IKTokenizer);
	}
	*/

    /**
     * 支持 Lucene5.5.5
     *
     * @author kavin
     */
    @Override
    protected TokenStreamComponents createComponents(String fieldName) {
        Tokenizer _IKTokenizer = new IKTokenizer(this.useSmart());
        return new TokenStreamComponents(_IKTokenizer);
    }

}

IKTokenizer.java

package org.wltea.analyzer.lucene;

import java.io.IOException;

import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
import org.apache.lucene.analysis.tokenattributes.TypeAttribute;

import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;
/**
 * 使用高版本lucene重写 IKAnalyzer(createComponents方法) 和 IKTokenizer(IKTokenizer方法)
 */
public final class IKTokenizer extends Tokenizer {
    private IKSegmenter _IKImplement;
    private final CharTermAttribute termAtt;
    private final OffsetAttribute offsetAtt;
    private final TypeAttribute typeAtt;
    private int endPosition;
	
	/*
	//支持Lucene4.7.2
	public IKTokenizer(Reader in, boolean useSmart) {
		super(in);
		offsetAtt = addAttribute(OffsetAttribute.class);
		termAtt = addAttribute(CharTermAttribute.class);
		typeAtt = addAttribute(TypeAttribute.class);
		_IKImplement = new IKSegmenter(input, useSmart);
	}
	*/
    /**
     * 支持Lucene5.5.5。
     * @author kavin
     */
    public IKTokenizer(boolean useSmart) {
        super();
        offsetAtt = addAttribute(OffsetAttribute.class);
        termAtt = addAttribute(CharTermAttribute.class);
        typeAtt = addAttribute(TypeAttribute.class);
        _IKImplement = new IKSegmenter(input, useSmart);
    }

    @Override
    public boolean incrementToken() throws IOException {
        clearAttributes();
        Lexeme nextLexeme = _IKImplement.next();
        if (nextLexeme != null) {
            termAtt.append(nextLexeme.getLexemeText());

            termAtt.setLength(nextLexeme.getLength());

            offsetAtt.setOffset(nextLexeme.getBeginPosition(), nextLexeme.getEndPosition());

            endPosition = nextLexeme.getEndPosition();

            typeAtt.setType(nextLexeme.getLexemeTypeString());

            return true;
        }
        return false;
    }

    @Override
    public void reset() throws IOException {
        super.reset();
        _IKImplement.reset(input);
    }
    @Override
    public final void end() {
        int finalOffset = correctOffset(this.endPosition);
        offsetAtt.setOffset(finalOffset, finalOffset);
    }
}

将本地maven 仓库中的ikanalyzer-2012_u6.jar包复制出来,并将重新编译好的IKAnalyzer.class和IKTokenizer.class复制进去
我的jar包在(C:\Users\Administrator.m2\repository\com\janeluo\ikanalyzer\2012_u6)根据你maven仓库设置的目录地址来确定

在这里插入图片描述

进入linux系统,将jar包复制到solr容器的 /opt/solr/server/solr-webapp/webapp/WEB-INF/lib 目录下

上传到宿主机

[root@localhost /]# rz

将jar包导入solr容器的 /opt/solr/server/solr-webapp/webapp/WEB-INF/lib 目录下,然后重新启动容器

[root@localhost /]#  docker cp ikanalyzer-2012_u6.jar solr:/opt/solr/server/solr-webapp/webapp/WEB-INF/lib

[root@localhost /]# docker stop my_solr
[root@localhost /]# docker start my_solr

定义分词器数据类型
1.将容器中的managed-schema配置文件导出来进行修改

[root@localhost /]# docker cp solr:/opt/solr/server/solr/mycores/core01/managed-schema /

添加字段类型

   #添加一个名字是:text_ik的字段类型
  <fieldType name="text_ik" class="solr.TextField" >
  #表示在键索引和查询的时候使用IK分词器
      <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>   
      <analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/> 
  </fieldType>

添加动态字段

#动态字段
#*_ik:表示将来添加的字段后面带有_ik都会用这里的,而不会自动添加
#text_ik: 表示将来_ik结尾的字段都会用text_ik字段类型
#indexed:表示是否分词
  <dynamicField name="*_ik" type="text_ik" indexed="true" stored="true"/>

在这里插入图片描述

将来增加字段和查询的时候想用分词,只要在字段的后面添加_ik就行了,或者指定fieldType是text_ik类型的就会自动分词。

3.将修改好的配置文件拷贝回容器目录

[root@localhost /]# docker stop solr
[root@localhost /]# docker cp managed-schema solr:/opt/solr/server/solr/mycores/core01/
[root@localhost /]# docker start solr

小知识:如果分词器配置出错,在插数据的时候会报错

模拟分词查询

{
     "id":"3",
     "title_ik":"我爱中国",
     "content_ik":"中国地大物博"
 }

在这里插入图片描述

在这里插入图片描述

发布了25 篇原创文章 · 获赞 4 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/liuhaiquan123521/article/details/98749306