分布式--solr搜索引擎

一、简介

搜索是项目中常用的功能,对于大数据量的搜索,查询关系型数据库是非常低效的,好在有三方专门用于搜索的工具,常用的搜索解决方案为:

  • 基于Apache Lucene实现
  • 基于百度API实现
  • 基于谷歌API实现

solr基于Lucene实现,本质是一个Java Web项目,并集成了Jetty服务器,Jetty和Tomcat差不多,也是一个JavaWeb容器,我们客户端只需要通过调用solr控制器,solr处理完后返回数据

反向索引

搜索使用反向索引将大大提高搜索效率,正向索引与反向索引的区别如下:

  • 正向索引:将查找内容分词,后根据分词完的词组,挨个进行搜索:
  • 反向索引:内容存入数据源的同时进行分词,搜索时直接根据词组搜索:

solr搜索原理

solr就是利用了反向索引,将搜索内容分词后,直接和存储内容的索引进行匹配:

solr拥有自己的数据库,以Document作存储

二、solr安装

前面提到过solr是Java Web项目,所以需要先装好JDK
官网下载:https://solr.apache.org/downloads.html

1. 解压

下载传入服务器后,解压:

tar xvf solr-8.11.2.tgz

2. 移动

移动到/usr/local目录下:

mv ./solr-8.11.2 /usr/local/

3. 修改启动参数

cd /usr/local/solr-8.11.2/bin/
vi solr.in.sh

找到SOLR_ULIMIT_CHECKS并修改:

SOLR_ULIMIT_CHECKS=false

4. 启动solr

如果是root用户,需要加上-force

./solr start -force

启动成功:

三、可视化管理界面

访问服务器8983端口可以进入solr的可视化管理界面:

  1. 整体信息
  2. 日志
  3. 安全性相关
  4. 核心。类似数据库DataBase
  5. Java信息
  6. 线程相关
  7. 如果有核心,将在此处显示

四、创建核心

solr安装完后,直接在界面上添加核心会报错,需要进行一些配置

1. 复制配置文件

cd /usr/local/solr-8.11.2/server/solr
mkdir test_core
cp -r configsets/_default/conf/ test_core/

2. 创建核心

instanceDir需要和上面创建的文件夹名一致,确认信息后,点击Add Core

等待创建结束后,下方就可以选择核心了:

四、中文分词配置

solr默认对中文只会按照每个字进行分词:

如果想要获得中文较好的支持,需要使用ik-analyzer.jar包,下载地址:https://search.maven.org/search?q=com.github.magese,注意对应solr大版本

1. 导入jar

将下载完后传入服务器,并移动到/usr/local/solr-8.11.2/server/solr-webapp/webapp/WEB-INF/lib目录下:

 mv ik-analyzer-8.5.0.jar  /usr/local/solr-8.11.2/server/solr-webapp/webapp/libs/

2. 修改配置文件

上面提到solr使用Document存储,Document包含的属性和属性类型都定义在managed-schemel中,争对中文的分词,我们需要自定义一个属性并赋予它类型

编辑对应核心的managed-schemel文件,/usr/local/solr-8.11.2/server/solr/test_core/conf目录下:

cd /usr/local/solr-8.11.2/server/solr/test_core/conf
vi managed-schema
2.1 添加属性

schema标签包裹区域内添加:

    <!--定义属性,type表示属性类型 indexed表示是否建立索引  stored表示是否显示给用户-->
    <field name="_china_" type="text_ik" indexed="true" stored="true" />
2.2 添加属性类型

和刚刚导入的jar包进行关联:

    <fieldType name="text_ik" 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="true" conf="ik.conf"/>
                    <filter class="solr.LowerCaseFilterFactory"/>
            </analyzer>
    </fieldType>

3. 重启solr

cd /usr/local/solr-8.11.2/bin
./solr stop -all
./solr start -force

在界面上使用_china_进行分词:

4. managed-schema说明

标签 属性 描述
< fieldType/> 定义属性类型
< field/> 定义属性
name 属性名称
type 属性的类型
indexed 该属性是否建立索引,即可以通过分词的词组被查找
stored 该属性是否需要返回给搜索用户,并不是所有属性都要展示
required 该属性是否必须
multiValued 该属性是否为复合属性,即属性中还有其他属性
< copyField/> multiValued搭配使用,用于表示符合属性中使用的多个属性
source 指定关联的属性名
dest 指定复合属性名
< uniqueKey/> 唯一主键属性
< dynamicField/> 定义动态属性,name通过通配符进行配置,可以表示多个属性

五、DataImport

接着我们将本地数据库中的数据导入到solr中,使用的是solr的dataimport,将dept部门表数据导入,SQL的创建在MyBatis--初入MyBatis中可以找到

1. 准备属性

managed-schema中定义与本地数据库字段相对应的属性:

cd /usr/local/solr-8.11.2/server/solr/test_core/conf
vi managed-schema

默认的一些属性类型可以在界面中查找:

部门表对应的属性:

    <field name="deptno" type="pint" indexed="false" stored="true"/>
    <field name="dname" type="text_general" indexed="true" stored="true"/>
    <field name="loc" type="text_ik" indexed="true" stored="true"/> 

2. 新建配置文件

在同一个目录下新建配置文件,用于连接数据库以及做数据库字段和属性的映射:

vi data-dept.xml

内容为:

<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
        <dataSource type="JdbcDataSource"
                driver="com.mysql.jdbc.Driver"
                url="jdbc:mysql://192.168.42.170:3306/mydb?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai&amp;tinyInt1isBit=false"
                user="root"
                password="root"/>
        <document>
            <entity name="dept" query="select * from dept">
                <!--
                 实现数据库的列和索引库的字段的映射
                 column 指定数据库的列表
                 name  指定索引库的字段名字,必须和managed-schema中定义的一样
                 -->
                 <field column="deptno" name="deptno"/>
                 <field column="dname" name="dname"/>
                 <field column="loc" name="loc"/>
            </entity>
         </document>
</dataConfig>

3. 配置solrconfig.xml

vi solrconfig.xml

config标签包裹中添加DataImport的使用:

 <!-- 配置数据导入的处理器 -->
  <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
      <!--  加载data-dept.xml  -->
      <str name="config">data-dept.xml</str>
     </lst>
  </requestHandler>

4. 导入jar包

还需要将两个jar包导入到\WEB-INF\lib目录中:

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

以及mysql的数据库驱动,下载后上传到服务器,再移动到\WEB-INF\lib目录中:

cp mysql-connector-java-8.0.29.jar /usr/local/solr-8.11.2/server/solr-webapp/webapp/WEB-INF/lib

5. 重启solr并导入数据

cd /usr/local/solr-8.11.2/
./solr stop -all
./solr start -force

界面上点击执行:

如果出错,可以查看/usr/local/solr-8.11.2/server/logs/solr.log的日志:

tail -f solr.log

我这边遇到的是mysql连接不上,修改mysql的user表,将root用户Host改为%

查询下数据,发现已经导入了:

六、solr集群搭建

solr内置了集群功能,是基于zookeeper实现的,启动集群非常便利

1. 开启集群

执行开启集群命令,可以使用-noprompt表示默认配置:

./solr -e cloud [-noprompt] -force

完成后,会创建两个node目录:

2. 重启

./solr start -c -p 8983 -s ../example/cloud/node1/solr/ -force
./solr start -c -p 7574 -z localhost:9983 -s ../example/cloud/node2/solr/ -force
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容