Solr7.6 配置中文分词器和业务字段

版权声明:本文为博主原创文章,转载请注明原文地址和原作者 https://blog.csdn.net/wcc27857285/article/details/86761402

上面一篇文章讲了如何安装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字段中,可以更快的搜索。


 

 

展开阅读全文

没有更多推荐了,返回首页