美文网首页程序员
Solr配置文件浅析

Solr配置文件浅析

作者: 阿懒土灵 | 来源:发表于2018-09-07 10:53 被阅读33次

接上一篇Linux下安装solr7.4,来谈谈solr的配置文件schema.xml和db-data-config.xml


首先看schema.xml:

 <!-- If you remove this field, you must _also_ disable the update log in solrconfig.xml
      or Solr won't start. _version_ and update log are required for SolrCloud
   -->
   <field name="_version_" type="plong" indexed="true" stored="true"/>

   <!-- points to the root document of a block of nested documents. Required for nested
      document support, may be removed otherwise
   -->
   <field name="_root_" type="string" indexed="true" stored="false"/>

   <!-- Only remove the "id" field if you have a very good reason to. While not strictly
     required, it is highly recommended. A <uniqueKey> is present in almost all Solr 
     installations. See the <uniqueKey> declaration below where <uniqueKey> is set to "id".
   -->
   <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />

<!-- Field to use to determine and enforce document uniqueness. 
      Unless this field is marked with required="false", it will be a required field
   -->
 <uniqueKey>id</uniqueKey>

field标签用来定义solr core中的字段。这里列出的三个字段如果没有特殊原因尽量保留。字段id被声明为uniqueKey,是让id来唯一标明一个solrdocument。通过这个id来对solrdocument进行操作。

type对应的是字段的属性,solr在schema中定义了很多属性,当然也可以自己定义属性。这里常见的属性有pint,pdate,string,boolean等。

  <!-- The StrField type is not analyzed, but indexed/stored verbatim. -->
    <fieldType name="string" class="solr.StrField" sortMissingLast="true" />

    <!-- boolean type: "true" or "false" -->
    <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
    <fieldType name="pint" class="solr.IntPointField" docValues="true"/>
    <fieldType name="pfloat" class="solr.FloatPointField" docValues="true"/>
    <fieldType name="plong" class="solr.LongPointField" docValues="true"/>
    <fieldType name="pdouble" class="solr.DoublePointField" docValues="true"/>
    <!-- KD-tree versions of date fields -->
    <fieldType name="pdate" class="solr.DatePointField" docValues="true"/>

不常见或者自定义的属性:

  <!-- A text field that only splits on whitespace for exact matching of words -->
    <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
      <analyzer>
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
      </analyzer>
    </fieldType>

该属性type="text_ws"定义的字段通过空格去分割文本变成一个一个的词,然后可以通过被分割的词去查找该document。
这里用到的逆向索引是solr的精髓,将分好的词作为key,文档标签作为value,对key建索引,去查询文档。

indexed属性如果为true则说明该字段将被建索引。

stored属性如果为true,则将该字段内容进行存储。

  <field name="title" type="string" indexed="false" stored="true" required="true" multiValued="false" />
   <field name="content" type="string" indexed="false" stored="true" required="true" multiValued="false"/>
<field name="text" type="text_hanlp" indexed="true" stored="false" required="true" multiValued="true"/>
   <copyField source="content" dest="text" />
   <copyField source="title" dest="text" />

multiValued如果设置为true,则表明该字段是由多个字段值组成的。比如上面例子中的text字段,它是由content和title字段组成。对text字段的操作就是对content和title字段进行操作。
上面这一段配置的意思是:有两个字段title和content,他们是自定义的text_hanlp属性,含有这属性的字段都接受hanlp的分词。这两个字段不创建索引,只做存储。text字段负责组合title和content字段,并创建索引用来检索。

required属性表明该字段值是否必须。

自定义属性text_hanlp来达到中文分词效果

 <!-- text_cn字段类型: 指定使用HanLP分词器,同时开启索引模式。通过solr自带的停用词过滤器,使用"stopwords.txt"(默认空白)过滤。
         在搜索的时候,还支持solr自带的同义词词典。-->
    <fieldType name="text_hanlp" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="com.hankcs.lucene.HanLPTokenizerFactory" enableIndexMode="true"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <!-- 取消注释可以启用索引期间的同义词词典-->
       <!-- <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>-->
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="com.hankcs.lucene.HanLPTokenizerFactory" enableIndexMode="false"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>

因为solr常用的ik分词、mmseg4j都已经不维护了。所以这里使用还有大神维护的Hanlp分词器。
配置Hanlp分词可以参考教程
hanlp-portable.jarhanlp-lucene-plugin.jar共两个jar放入${tomcat}/webapps/solr/WEB-INF/lib

配置好之后,可以在solr admin界面查看分词效果:


solr分词

定义动态字段

<dynamicField name="*_i"  type="int"    indexed="true"  stored="true"/>

dynamicField定义的就是动态字段,只要符合_i结尾的字段都可以被这个字段所定义。同样的,schema.xml中已经定义好了很多动态字段。可以直接拿来用。


db-data-config.xml配置文件
该文件主要配置数据库连接和字段对应关系。用来做全量和增量索引的创建,相对schema.xml简单很多。
下面看下主要配置:

<dataSource driver="com.mysql.jdbc.Driver"                   
                         url="jdbc:mysql://127.0.0.1:3306/database? 
                                           useUnicode=true&amp;characterEncoding=UTF-8" 
                         user="root" 
                         batchSize="-1"
                         password="123456"/>

dataSource用来定义数据库连接,batchSize设为-1是为了避免查询创建索引导致内存溢出。

<document>
        <entity dataSource="jdbcDataSource" name="core" pk="id"  
        query="select * from tableName" >
            <field column="id" name="id"></field>
            <field column="title" name="title"></field>
            <field column="content" name="content"></field>
            <field column="author" name="author"></field>
        </entity>
    </document>

这里做了一个简单的定义,看着很清楚。columen标明的是数据库查出的字段,name标明的属性和schema中定义的字段对应。

<entity name="item" query="select * from item"
                deltaQuery="select id from item where last_modified > '${dataimporter.last_index_time}'">
            <field column="NAME" name="name" />

deltaQuery用来做增量索引的创建。

当文件配置好之后,重启tomcat。访问solr/index.html。


solr创建索引

选择1,然后2可以选择全量索引或者创建增量索引。勾选clean会清楚上次的索引,点选commit创建索引进行提交。点击execute进行执行。


下一篇,更新spring boot 中集成solrJ对solr进行操作。

相关文章

网友评论

    本文标题:Solr配置文件浅析

    本文链接:https://www.haomeiwen.com/subject/ponqgftx.html