Solr 教程
---恢复内容开始---
1.Solr概述
先看看官网的介绍
Solr is the popular, blazing-fast, open source enterprise search platform built on Apache Lucene™.
可以看到它是基于Lucene的搜索平台,一些搜索功能我们都可以通过它来实现。
2.Solr原理及核心概念
Solr的原理很简单,对于用户的输入文件按照需求建立不同的索引,需要数据时就根据索引来查找,所以solr的核心就是索引的创建。
就好比一本空的活页书,现在每来一张菜谱(输入文件)你就记录下它的用料如西红柿(这就是我们需要的索引类型)并把它加入书中,最后有成千上百页的菜谱了。此时你想查找那些菜谱用到了西红柿,我们就直接到刚才记录的文件中去查找它的页号而不用去一页一页翻了。
下面是Solr中的核心概念
- Document:每个被索引的用户输入文件
- Field:索引的类型
- Solr schema:描述solr如何创建索引以及如何查询索引
3.Solr目录结构
安装过程见https://lucene.apache.org/solr/guide/6_6/installing-solr.html

下面介绍几个重要的目录
- bin目录不用多说一般存放的都是执行文件,启动solr就是要进入此目录下输入命令solr start
- contrib/dist solr的核心jar包与扩展jar包
- example solr的简单实例
- ext外部的jar包,后面我们要用到的分词器,mysql驱动都是放在这里方便同一管理,此目录不是solr自带的
- server 重点,solr作为服务启动的配置文件都存放在这里
4.Solr的的配置工作
使用背景:实现类似知乎问题全文搜索的功能。
数据库中的question表
(后面索引根据此字段来建立)
几个重要的配置文件
- managed-file(D:\solr\solr-6.2.0\solr-6.2.0\server\solr\wenda\conf wenda时你的项目名称) 此文件管理solr如何创建索引及搜索索引
- solrconfig 配置导入数据,添加jar包
- solr-data-config.xml 配置数据源
上述三个文件都在 D:\solr\solr-6.2.0\solr-6.2.0\server\solr\wenda\conf下
我们看一看Solr的执行流程,然后再一步一步看
1.managed-file
<field name="question_content" type="text_ik" multiValued="true" indexed="true" stored="true"/> <field name="question_title" type="text_ik" multiValued="true" indexed="true" stored="true"/>
name和type指定索引名称,字段类型
<fieldType name="text_ik" class="solr.TextField">
<!--索引时候的分词器--> <analyzer type="index"> <tokenizer class="org.wltea.analyzer.util.IKTokenizerFactory" useSmart="false"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer>
<!--查询时的分词器--> <analyzer type="query"> <tokenizer class="org.wltea.analyzer.util.IKTokenizerFactory" useSmart="true"/> </analyzer> </fieldType>
再来看看字段类型text_ik是怎么定义的,我看可以看到里面定义了两个分词器。
我们介绍一下什么是分词器,英文其实很好办按空格分就行比如"Hello World"分成Hello 和World就行,但汉语就不行了,比如“今天天气很好“,使用英语的分词器就分成了一个一个 的单字体了。 所以我们要使用中文的分词器,这里使用的就是IKTokenizer,可以在网上直接重新编译打包(后面会讲如何编译打包)后放在solr的ext目录下D:\solr\solr-6.2.0\solr- 6.2.0\ext\ikanalyzer
另外filter指定过滤器,上面的过滤器表示将所以字母转换成小写,并且丢弃掉空格和非字母。
更多过滤器见 https://lucene.apache.org/solr/guide/6_6/tokenizers.html#Tokenizers-LetterTokenizer
最后useSmart属性指定了分词粒度的大小,false表示更细粒度的切分如下图

2.solrconfig
添加必要的jar包,上面说到的分词器,mysql连接的jar包,solr导入数据的handler,配置handler
<lib dir="${solr.install.dir:../../../..}/ext/ikanalyzer" regex=".*\.jar" /> <lib dir="${solr.install.dir:../../../..}/ext/mysql" regex=".*\.jar" /> <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-\d.*\.jar" />
....
....
....
<requestHandler name="/dataimport" class="solr.DataImportHandler">
<lst name="defaults">
<str name="config">solr-data-config.xml</str>
</lst>
</requestHandler>
注意到solr-data-config.xml,这个文件就是用来配置数据源的文件,文件内容如下
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/wenda?useSSL=false"
user="root"
password="521997"/>
<document>
<entity name="question" query="select id,title,content from question">
<field column="content" name="question_content"/>
<field column="title" name="question_title"/>
</entity>
</document>
</dataConfig>
可以看到我们配置了mysql的数据源,documen就是一整个输入数据的集合里面还配置了列值与solr索引类型的对应关系
4.Solr的使用 API(Jsolr)编程及客户端UI使用

左侧选择你的项目,点击Dataimport,然后再点击右侧下方的Execute,刚才配置的数据库内容就自动导入进去了。
导入有两种形式full-import这个会删除原来的索引索引并全部重新建立 delta-import根据我们新增或修改的字段进行索引的修改,原来就是solr记录最近一次导入时间,solr通过这个时间和数据库表中的timestamp列进行比较,看那些数据是之后添加或修改的。
solrj编程详见https://lucene.apache.org/solr/guide/6_6/using-solrj.html
这里我说几点需要注意的

h1表示高亮,q表示查询的字段
这是查找出来的结果,结构是Map<String,Map<String,List>>
6.Solr集群
现实中我们常常让多个机器上运行solr,构成Solr Cloud,我们先了解一下基本的术语。
- Collection 一个搜索索引(如上面的单机版solr,我们就创建了一个collection wenda)
- Shard/Slice 单个Collection的逻辑部分
- Replica 对Shard的物理表现形式,也是对它的拷贝,一个Replica存在一个core中
- LeaderReplia 与Replia形成主从机制
- SolrCore/Core 封装了单个物理索引,多个core可以组成一个shard
一个collection由一个或多个shard组成,一个shard包含一个或多个replia,一个replia是一个core

---恢复内容结束---
浙公网安备 33010602011771号