Solr中文检索copyField自定义配置

1 Solr copyField是什么?

1.1. 应用场景

我们在搜索(检索)的时候,比如输入凯哥Java。一篇文章一般分为标题、简介、内容、作者、创建时间、修改时间、分类、标签等其他很多字段。在检索的时候,输入的关键字需要指定字段(solr中称为域,这里就姑且称之为字段。望理解)进行检索(不可能从一个表中所有字段进行检索,因为有些字段不需要)。比如,输入关键字想从标题、简介、内容、作者这四个字段中检索。那么我们是不是在solrschema.xml文件中重复这四个字段,然后在刷新solr的时候每次冗余(这里使用了数据库字段的说法,不对的。为了便于理解就用冗余望理解)这四个字段吗?

当然不是,solr为我们提供了一个copyField这个字段()。也就是复制域。

1.2.语法:

<copyField source=”” dest=””>

说明:

source:原来的域。也就是你想要复制的域

dest(destination):目标域。也就是要复制到那个字段。


1.3.用法举例:

Solr的schema.xml中:

定义了name字段

Solr中文检索之copyField自定义配置_solr



<field name="sku" type="text_en_splitting_tight" indexed="true" stored="true" omitNorms="true"/>

   <field name="name" type="text_general" indexed="true" stored="true"/>

   <field name="manu" type="text_general" indexed="true" stored="true" omitNorms="true"/>

   <field name="cat" type="string" indexed="true" stored="true" multiValued="true"/>

   <field name="features" type="text_general" indexed="true" stored="true" multiValued="true"/>

   <field name="includes" type="text_general" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true" />




定义了一个text字段:



<!-- catchall field, containing all other searchable text fields (implemented

        via copyField further on in this schema  -->

   <field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/>



name字段内容复制到text字段中:

Solr中文检索之copyField自定义配置_solr_02



<copyField source="name" dest="text"/>


说明:将name这个字段()复制到text字段()中。


2 copy到使用了自定义的中文分词器中

2.1.先solr中引入中文分词器(这里就省略。以后会详细讲解)

2.2.在solrschema.xml中添加自定义的分词类型




 <fieldType name="text_kaige" class="solr.TextField">

<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>

 </fieldType>



2.3.在copyField字段使用自定义目标和自定义中文分词器

2.3.1创建自定义目标字段使用自定义的中文分词器

Solr中文检索之copyField自定义配置_自定义_03


<field name="keywords_text" type="text_kaige" indexed="true" stored="false" multiValued="true"/>

2.3.2.在copyField字段中使用自定义目标字段

Solr中文检索之copyField自定义配置_字段_04



 <copyField source="product_name" dest="keywords_text"/>

<copyField source="product_catalog_name" dest="keywords_text"/>


完整的:


 <!--自定义 -->

    <fieldType name="text_kaige" class="solr.TextField">

<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>

 </fieldType>

<!--自定义目标域-->

 <field name="keywords_text" type="text_kaige" indexed="true" stored="false" multiValued="true"/>

 <!-- copyField使用自定义目标域-->

 <copyField source="product_name" dest="keywords_text"/>

<copyField source="product_catalog_name" dest="keywords_text"/>





配置完成重启solr服务。

使用代码测试:


检索高亮显示结果:

检索目标:


进行检索结果:



结果评测:

出现想要的结果且高亮。至此配置自定义目标域使用自定义分词器ok.

需要注意的:

在使用copyField时候,sourcedest这两个都需要先申明才可以。