首先solr默认的是英文分词:
对中文的分词是非常不友好的:一个字一个字的分词
观察你建的wenda项目的配置文件
发现他分词的原理:
type为text_general为英语通用文本,也就是按空格分词,
创建一个自己的中文分词的索引字段:
<field name="question_title" type="text_ik" indexed="true" stored="true" multiValued="true"/>
question_title是自己定义的一个索引字段名,
text_ik是自己定义的一个中文分词,
indexed="true"为是不是要为这个字段建立一个索引,
stored="true"为这个字段索引的数据是不是要保存,
multiValued="true"为这个字段是不是有多个值,
为了建立一个中文的分词,先分析英文分词,下面看一下还是这个配置文件对于英文分词的配置:
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index"> #对这个字段创建索引时,采用solr自带#采用的是一个工厂模式的的标准的分词器,创建出来的是一个标准的英文分词
<tokenizer class="solr.StandardTokenizerFactory"/>
#字段_text_的解析text_general
<!--建索引的分词-->
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/> #对这个字段创建索引时,采用solr自带的标准的分词器,创建出来的是一个标准的英文分词
#filter是过滤器,是指一些无关紧要的词,当有一段文字要进索引的时候首先解析这一段文本是一段通用文本,当对通用文本进行索引的时候呢需要用一个标准的英文分词器对他分词比如hello word分完词后就是一个hello和一个world,还有一些无用的东西例如空格啊之类的,这个过滤器就是对分完词后多余的东西进行处理,stopwords.txt这类型的,在中文里就是类似于,的,是,逗号句号等无意义的东西的过滤掉
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /><!-- in this example, we will only use synonyms at query time
<filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
-->#可以通过同义词的方式把tv和television等相同意义的词关联起来
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<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>
<!--建立查询的分词-->英文分词同建立索引一样,以空格分词,而中文就不一样了,下面会讲
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<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>
接下来创建自己的中文分词:
使用IK-Analyzer:
两种分词效果,智能分词适用于对查询语句分词,细粒度分词适合于对数据建立索引,
在managed-schema中加一个中文的fieldType:
<field name="all_text" type="text_ik" multiValued="true" indexed="true" stored="true"/>
<field name="question_content" type="text_ik" multiValued="true" indexed="true" stored="true"/>
<field name="question_title" type="text_ik" multiValued="true" indexed="true" stored="true"/>
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index"> #在建立索引时不使用智能分词
<tokenizer class="org.wltea.analyzer.util.IKTokenizerFactory" useSmart="false"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query"> #在查询语句时使用智能分词
<tokenizer class="org.wltea.analyzer.util.IKTokenizerFactory" useSmart="true"/>
</analyzer>
</fieldType>
加一个读取数据库配置的文件:solr-data-config.xml,放到与managed-schema一个文件夹下
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/luntan"
user="root"
password="nankai416"/>
<document>
<entity name="question" query="select id,title,content from question">
<field column="content" name="question_content"/>
<field column="title" name="question_title"/>
</entity>
</document>
</dataConfig>
在solrconfig.xml中添加jar包路径:
<lib dir="${solr.install.dir:../../../..}/ext/ikanalyzer" regex=".*\.jar" />
<lib dir="${solr.install.dir:../../../..}/ext/mysql" regex=".*\.jar" />
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-\d.*\.jar" />
如图:
第一个jar包是自己生成的,下篇文章讲解怎么生成自己的jar包,mysql是一个java连接数据库的jar包可自己下载如: