1.1 solr的下载
- 途径1: 官网网址: http://lucene.apache.org/ 与Lucene的官网是一个
- 途径2: 下载历史版本的网址: http://archive.apache.org/dist/lucene/solr/
- 途径3: 使用资料中提供的即可(推荐)
1.2 solr的目录介绍
- solr的根目录
- example的目录
## 1.3 solr服务的启动
1.3.1 solr的启动方式一 : start.jar(了解)
启动步骤:
-
- 打开cmd窗口
-
- 切换目录到solr的example的目录下
-
- 执行 java -jar start.jar
注意: 由于jar包已经内置了一个web服务器(jetty) , 其默认的访问的为8983
1.3.2 solr的启动方式二 : solr.war[掌握]
启动步骤:
-
- 首先打开
solr文件夹
下example目录
下的webapps目录
下
- 首先打开
-
拷贝
此目录下的solr.war
, 将其复制到tomcat的webapps目录
下
-
启动tomcat
, 将war包进行解压
, 然后关闭tomcat并将war包删除或者更改后缀名
即可
-
将其原有war包更改的主要目的是防止再次解压, 导致原有的设置失效
-
- 将资料中tomcat运行solr所需要的jar包复制到
解压在tomcat下的solr
的web-inf
下的lib目录
中 ,classes目录复制到web-inf
下
- 将资料中tomcat运行solr所需要的jar包复制到
- 5)将example中solr的目录建议赋值到和tomcat同级的目录下(方便管理)
-
- 打开tomcat的bin目录找到Catalina.bat文件, 将其右键打开
-
- 将下列参数设置到此文件中即可
set "JAVA_OPTS=-Dsolr.solr.home=目录位置"
- 注意:
目录位置就是刚刚复制过来的solr的目录(solr安装包下的example文件夹下的solr文件夹)
-
- 启动tomcat,访问localhost:8080/solr即可
2. solr的管理界面
-
仪表盘
-
日志窗口: 记录solr在启动过程中和启动后执行过程中的执行信息
解决警告信息:
第一步: 将solr的安装包中依赖包的两个目录, 复制到solr的索引库中
第二步: 打开索引库中的collection1中conf目录, 将solrconfif.xml右键打开, 去掉两个…/即可
-
core 窗口: 用于配置solr的索引库
-
solr中支持配置和管理多个索引库, 就像数据库中有多个database是一样的
如何配置多个索引库呢?
简单方案: 将collection1复制一个,然后删除其data文件夹并修改core.properties配置文件即可
-
core selector: core的选择器, 用来针对不同core进行操作的
-
针对core selector的详细讲解:
2.1 使用solr的管理界面进行添加索引
2.2 使用solr的管理界面进行查询索引
3. solr的配置文件(了解)
3.1 solrConfig.xml : solr的核心配置文件
solrconfig.xml 配置文件主要定义了 solr 的一些处理规则,包括索引数据的存放 位置,更新,删除,查询的一些规则配置。
一般此文件不需要进行修改, 采取默认即可
3.2 schema.xml: solr约束文件
Solr中会提前对文档中的字段进行定义,并且在schema.xml中对这些字段的属性进行约束,例如:字段数据类型、字段是否索引、是否存储、是否分词等等
<!--第一种标签为 field标签: 主要是用来指定字段名称的, Lucene中是有用户在程序中指定, solr中需要提前在配置文件中指定-->
<field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/>
<!--name: 字段的名称
type: 字段的类型
indexed: 是否索引
stored: 是否保存
multiValued: 是否多值, 这个字段, 类似存储一个数组
这里有两个不允许删除的: 一个是 _version__ 一个是 _root__ 这两个是solr内部需要使用的字段
有一个字段的名称必须为id,其类型都不允许进行修改 原因是id字段已经被主键使用uniqueKey
其余的是一些初始化好的字段
-->
<!--第二种标签为dynamicField, 被称为是动态域 -->
<dynamicField name="*_is" type="int" indexed="true" stored="true" multiValued="true"/>
<!--此种标签是为程序的扩展所使用的, 因为我们不可能把所有的字段全部定义好, 所以就需要动态域来进行动态扩展-->
<!--第三种标签为 uniqueKey: 必要标签, 表名文档的唯一属性, 一般默认为id-->
<uniqueKey>id</uniqueKey>
<!--Lucene中是自己进行维护, solr中, 需要自己指定-->
<!--第四种标签为 copyField: 被称为是复制域-->
<copyField source="cat" dest="text"/>
<!--source: 表名要复制那个字段的值
dest: 复制到那个字段上
此种标签主要是为了查询所使用的,
例如, 当查询Text字段的时候, 实质上相当于查询title和name两个字段-->
<!--第五种标签: fieldType 字段类型定义标签-->
<fieldType name="managed_en" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.ManagedStopFilterFactory" managed="english" />
<filter class="solr.ManagedSynonymFilterFactory" managed="english" />
</analyzer>
</fieldType>
<!--此种标签是用来定义字段的类型的,可以指定此字段使用何种分词器进行分词-->
3.3 引入ik分词器
-
第一步: 导入ik相关的依赖包
- 将三个文件放置在tomcat>webapps>solr>WEB-INF>lib下(此步骤在部署solr到tomcat中的时候, 就已经导入了)
- 将三个文件放置在tomcat>webapps>solr>WEB-INF>lib下(此步骤在部署solr到tomcat中的时候, 就已经导入了)
-
第二步: 导入ik相关的配置文件(ik配置文件, 扩展词典和停止词典)
-
将三个文件放置在tomcat>webapps>solr>WEB-INF>classes下(此步骤, 在部署solr到tomcat中的时候, 已经导入)
-
第三步, 在schema.xml配置文件中自定义一个字段类型, 引入ik分词器 , 放在最后即可
-
第四步: 为对应的字段设置为text_ik类型即可
看自己需要将那些字段用ik分词器就将其type改为"text_ik"
简化并修改后的schema.xml
<?xml version="1.0" encoding="UTF-8" ?>
<schema name="example" version="1.5">
<!-- 不删除
-->
<field name="_version_" type="long" indexed="true" stored="true"/>
<field name="_root_" type="string" indexed="true" stored="false"/>
<!--不删除
id: 文档的唯一标识
在lucene中文档唯一的id是lucene自己维护的,, 在solr中,需要程序员自己维护
id字段了的设置内容, 尽量的不要动
-->
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<!--
field: 用来定义字段的
name: 字段的名称
type: 字段类型
indexed: 是否分词
stored: 是否保存
multiValued: 是否是多值(当前的这个字段可以是一个数组)
-->
<field name="name" type="text_ik" indexed="true" stored="true"/>
<field name="title" type="text_ik" indexed="true" stored="true" />
<field name="content" type="text_ik" indexed="true" stored="true" />
<!--此字段主要用来做查询使用的-->
<field name="text" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<!--
dynamicField: 动态域
为了程序的扩展使用的, 因为有时候无法在配置文件中将所以的字段全部定义了
对于solr来讲, 提供了动态域, 只需要用户在添加索引的时候字段名称的后缀名和动态域的名称一致就可以
-->
<dynamicField name="*_c" type="text_ik" indexed="true" stored="true"/>
<!-- Field to use to determine and enforce document uniqueness.
Unless this field is marked with required="false", it will be a required field
-->
<!--
uniqueKey: 文档的唯一标识的字段是谁
-->
<uniqueKey>id</uniqueKey>
<!--
copyField: 复制域
source: 来源字段
dest: 目标字段
复制域的作用是用来做查询的, 将其他几个字段的值全部的复制到目标字段中
当进行查询的时候, 如果查询的是text字段, 相当于查询了cat和name字段了
-->
<copyField source="content" dest="text"/>
<copyField source="name" dest="text"/>
<!--
fieldType: 字段的类型
name: 类型的名称
class: 类型原生的类
在这个标签中, 可以用来规定资格字段类型的分词效果
可以通过这个标签设置新的字段类型,例如 ik分词器
-->
<fieldType name="string" class="solr.StrField" sortMissingLast="true" />
<!-- boolean type: "true" or "false" -->
<fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>
<!--ik分词器配置-->
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
</schema>