创建并配置core以及IK 分词器
第二 创建并配置core
1、使用命令创建core实例
1-1、core的创建方式有很多种,以下列出两种比较方便的:
1-1-1、使用命令创建:
在bin目录下执行solr create -c test ,创建一个core,默认创建出来的位置如下:
1-1-2、使用管理员页面创建core实例
需要先在D:\solr-8.7.0\server\solr下创建test文件夹及在test文件夹下创建data文件夹,找到D:\solr-8.7.0\server\solr\configsets_default 文件夹把conf文件夹拷贝到test下,然后才能创建成功。
使用tomcat 启动方式,创建的core 放在solrhome 下,同样需要拷贝conf 文件夹
1.4.低版本需要修改solrconfig.xml
<lib dir="${solr.install.dir:../../../..}/contrib/extraction/lib" regex=".*\.jar" />
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-cell-\d.*\.jar" />
<lib dir="${solr.install.dir:../../../..}/contrib/clustering/lib/" regex=".*\.jar" />
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-clustering-\d.*\.jar" />
<lib dir="${solr.install.dir:../../../..}/contrib/langid/lib/" regex=".*\.jar" />
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-langid-\d.*\.jar" />
<lib dir="${solr.install.dir:../../../..}/contrib/velocity/lib" regex=".*\.jar" />
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-velocity-\d.*\.jar" />
修改为相对路径:
<lib dir="../../contrib/extraction/lib" regex=".*\.jar" />
<lib dir="../../dist/" regex="solr-cell-\d.*\.jar" />
<lib dir="../../contrib/clustering/lib/" regex=".*\.jar" />
<lib dir="../../dist/" regex="solr-clustering-\d.*\.jar" />
<lib dir="../../contrib/langid/lib/" regex=".*\.jar" />
<lib dir="../../dist/" regex="solr-langid-\d.*\.jar" />
<lib dir="../../contrib/velocity/lib" regex=".*\.jar" />
<lib dir="../../dist/" regex="solr-velocity-\d.*\.jar" />
2、配置schema
schema 是用来告诉solr 如何建立索引的, schema 配置文件决定着solr 如何建立索引,
每个字段的数据类型,分词方式等,老版本的schema 配置文件的名为schema.xml 使用
手工编辑。但是现在新版本的schema 配置文件的名为managed-schema,配置方式不再
是用手工编辑而是使用schemaAPI 来配置,官方给出的解释是使用schemaAPI 修改
managed-schema 内容后不需要重新加载core 或者重启solr 更适合在生产环境下维护,
如果使用手工编辑的方式更改配置不进行重加载core 有可能会造成配置丢失,配置文
件所在的路径如下图:
2-1、schema 主要成员
fieldType
为field 定义类型,字段类型定义了Solr 如何解析字段数据并将数据检索出来
Analyzer
是fieldType 下的子元素,分词器,由一组tokenizer 和filter 组成,如下图所示
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<!-- in this example, we will only use synonyms at query time
<filter class="solr.SynonymGraphFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
<filter class="solr.FlattenGraphFilterFactory"/>
-->
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
Field
是创建索引用的字段,如果想要这个字段生成索引需要配置他的indexed 属性为true,
stored 属性为true 表示存储该索引。如下图所示每个field 都要引用一种fieldType 由type
属性定义
这里描述的只是最常用的三个元素,关于更多的schema的介绍请参考:https://lucene.apache.org/solr/guide/8_6/documents-fields-and-schema-design.html
2-2 Schema API
Schema API 其实就是用post 请求向solr 服务器发送携带json 参数的请求,所有操作内
容都封装在json 中,如果是linux 系统直接使用curl 工具,如果是windows 系统推荐使
用Postman
Postman 工具下载:https://www.postman.com/downloads/
POST 请求路径(Solr单独运行方式):http://localhost:8888/solr/test/schema
POST 请求路径(tomcat运行的方式):http://localhost:8080/solr/test/schema
Body 请求数据如下:
{
"add-field":{
"name":"测试数据",
"type":"string",
"stored":true
}
}
添加之后,在D:\solrhome\test\conf 下查看managed-schema 文件发现多了一个field:
常用API:
add-field:添加field
delete-field: 删除field
replace-field: 替换field
更多API 参考http://lucene.apache.org/solr/guide/8_6/schema-api.html
也可以手工修改或者使用solr 管理界面添加。
注意如果使用solr7.5 会报异常:
java.lang.ClassNotFoundException: solr.KoreanTokenizerFactory
需要把D:\solrhome\test\conf 下的 managed-shema 文件中和Korean 有关的配置都删除:
<tokenizer class="solr.KoreanTokenizerFactory" decompoundMode="discard" outputUnknownUnigrams="false"/>
<dynamicField name="*_txt_ko" type="text_ko" indexed="true" stored="true"/>
<fieldType name="text_ko" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.KoreanTokenizerFactory" decompoundMode="discard" outputUnknownUnigrams="false"/>
<filter class="solr.KoreanPartOfSpeechStopFilterFactory" />
<filter class="solr.KoreanReadingFormFilterFactory" />
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
3、IK分词器
solr 自带了一些中文分词器,比较好用的是SmartChineseAnalyzer,但是扩展性比较差
不能自定义扩展中文词库,所以这里选择使用IKAnalyzer,这是第三方的一个分词器可
以很好的扩展中文词库,IKAnalyzer 下载后解压会有如下文件:
官方下载地址(需要安全上网):
https://code.google.com/archive/p/ik-analyzer/downloads
网盘下载地址:
链接:https://pan.baidu.com/s/1gSWVcrNL4n2j6oYZS5M0pg
提取码:65nj
3-1.拷贝jar 包
把核心jar 文件IKAnalyzer2012_u6.jar 复制到solr WEB 应用的lib 文件夹下,
D:\solr-7.4.0\server\solr-webapp\webapp\WEB-INF\lib 下或者如果部署到了tomcat 下,则
拷贝到D:\Tomcat 9.0\webapps\solr\WEB-INF\lib 下
使用自带的IKAnalyzer2012_u6.jar容易报异常:
SolrCore Initialization Failures
test: org.apache.solr.common.SolrException:org.apache.solr.common.SolrException: Could not load conf for core test: Can’t load schema d:\solrhome\test\conf\managed-schema: Plugin init failure for [schema.xml] fieldType “text_ik”: Plugin init failure for [schema.xml] analyzer/tokenizer: Error loading class ‘org.wltea.analyzer.lucene.IKTokenizerFactory’
Please check your logs for more information
可以换成压缩包里面的ik-analyzer-solr7x.jar,
3-2修改并拷贝配置文件
配置文件中指定了扩展词库和停词词库,多个dic 文件用分号隔开,使用UTF-8 无bom
格式打开编辑
把配置文件和词库等文件复制到WEB 应用的classes 文件夹下,如果子WEB-INF 下没有这
个文件夹自己创建即可:
3-3、应用分词器
在Schema 中应用分词器,在D:\solrhome\test\conf文件夹下的managed-schema 文件中加入如下代码:
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false"/>
</analyzer>
</fieldType>
IKAnalyzer 的默认分词模式为细粒度分词,如果使用智能分词,则useSmart 设为true。
定义了一个text_ik 这个字段类型并采用Ik 分词器,接下来在field 元素定义式指定
type=text_ik 就可以把这个分词器应用在这个field 中。
3-4、测试分词效果
配置后重启solr 服务, solr restart –p 端口号
如果是tomcat 方式,则直接重启tomcat 即可
下一篇: docker私有仓库的搭建和使用详解
推荐阅读