上面一篇文章讲了如何安装solr,现在来配置中文分词器 跳转地址
在solr7.0以前是使用IKAnalyzer,但是Solr7.6已经自带了中文分词器,本文使用的是solr自带的中文分词器
直接使用solr启动服务
1.
使用tomcat启动solr
1.首先在solrhome下面新建一个core,随便取名,我是取了一个叫AA
solrhome目录下可以有多个core,每一个core对应一个文件夹,文件夹下必须包含conf等配置文件
mkdir AA
2.复制/usr/local/solr-7.6.0/server/solr/configsets/_default下的conf文件夹到 新建的AA下面
cd /usr/local/solr-7.6.0/server/solr/configsets/_default
cp -r conf /usr/local/solrhome/AA
3.复制中文分词器的相关jar包到solr工程下
cd /usr/local/solr-7.6.0/contrib/analysis-extras/lucene-libs
cp lucene-analyzers-smartcn-7.6.0.jar /usr/local/tomcat/webapps/solr/WEB-INF/lib
4.在/solrhome/AA/conf 下的配置文件managed-schema中添加下面的一段配置,配置jar包
<fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
</analyzer>
</fieldType>
5.重启tomcat
6.访问solr主页,新建一个core
第二栏填之前新建的文件夹名AA
7.测试,选择new_core->Analysis
添加业务字段:
solr是用来提供搜索服务的,那么solr的数据哪里来呢,这时候就需要把我们的数据库中的相关的部分数据导入到solr中,生成solr的索引库,然后solr通过查询索引库来提供搜索服务
那么既然是数据库部分数据,到底是哪些表的哪些列要被放进solr中的?其实就是满足下面两个条件中的一个即可
1.是否要在此字段上进行搜索 。这个很好理解,如淘宝上搜索用户要搜索“手机”,那么product_name就应该被加入
2.此字段结果需不需要显示。 如前端要展示用户年龄,那么user_age字段就需要加入
不管是使用上面的哪一种方式启动,都要在new_core/conf/managed-schema配置文件中配置相关的数据库业务字段。
格式为:
<field name="user_name" type="string" indexed="true" stored="true"/>
field称为域,其实就是对应数据库的列(字段)
type 就是fieldType,solr中定义了很多,比如string,bool,long等等,上面的text_ik也是一种我们定义的fieldType
indexed: true 代表该字段应该被索引,既可搜索和可排序
stored:true就是返回该字段结果,false就是不返回该字段的结果,但不影响搜索索引
string类型是不支持分析器的,而是逐字索引/存
solr.TextField允许自定义文本分析器,可以指定不同的分析器,text_ik就是一个solr.TextField,指定了中文分词器,所以type配置为text_ik就代表该字段支持中文分词
举例配置:
<field name="produce_name" type="text_ik" indexed="true" stored="true"/>
<field name="product_image" type="string" indexed="false" stored="true" />
<field name="product_desc" type="text_ik" indexed="true" stored="false" />
<field name="product_copy" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="produce_name" dest="product_copy"/>
<copyField source="product_desc" dest="product_copy"/>
- product_name:商品名称支持分词,要被索引,也要返回结果
- product_image:商品图片实际上是一串url,所以为string,不支持分析,也不需要被索引 indexd=false,但前台要展示stored=true
- product_desc:商品描述,支持分词,要被索引,但是前台不需要展示,只有在点击该商品时,再显示具体的描述,所以配置stored=false
下面的copyfield是复制域:
copyField commands copy one field to another at the time a document is added to the index.
It's used either to index the same field differently,or to add multiple fields to the same field for easier/faster searching.
copyField复制一个字段到另一个字段当一个document被加到索引库的时候
它既可以对同一个字段进行不同的索引,也可以将多个字段添加到同一个字段中,以便于/更快地进行搜索。
此处将product_name和product_desc放到product_copy字段中,可以更快的搜索。