1 solr索引和搜索过程:
2 分词器:
在创建索引时会用到分词器,在使用字符串搜索时也会用到分词器,这两个地方要使用同一个分词器,否则可能会搜索不出结果。
Analyzer(分词器)的作用是把一段文本中的词按一定规则进行切分。对应的是Analyzer类,这是一个抽象类,切分词的具体规则是由子类实现的,所以对于不同的语言(规则),要用不同的分词器。(也就是说不同的分词器分词的规则是不同的!)
分词器的一般工作流程:
1、切分关键词
2、去除停用词(去掉干扰字符)
3、对于英文单词,把所有字母转为小写(搜索时不区分大小写)
停用词:
有些词在文本中出现的频率非常高,但是对文本所携带的信息基本不产生影响。
英文
a、an、the、of...
中文
的、了、着、是 、标点符号等
文本经过分词之后,停用词通常被过滤掉,不会被进行索引。
在检索的时候,用户的查询中如果含有停用词,检索系统也会将其过滤掉(因为用户输入的查询字符串也要进行分词处理)。
排除停用词可以加快建立索引的速度,减小索引库文件的大小。
英文停用词:http://blog.csdn.net/shijiebei2009/article/details/39696523
中文停用词http://wenku.baidu.com/link?url=I8__RQMCRwSwcru8nPHLu7U5pvt7h8z_kEVU1vgN9Td1UWN88u_qyxZ4k-fERH9SJCXn7wiMWPH6aBpb2ZTnXE7ro9JEl-rGFh4KUxl7YZu
中文分词器
单字分词:
如:“我们是中国人”效果:“我”“们”“是”“中”“国”“人”(StandardAnalyzer、ChineseAnalyzer就是这样)
二分法分词:按两个字进行切分。
如:“我们是中国人”,效果:“我们”、“们是”、“是中”、“中国”、“国人”。(CJKAnalyzer就是这样)。
词库分词:按某种算法构造词,然后去匹配已建好的词库集合,如果匹配到就切分出来成为词语。通常词库分词被认为是最理想的中文分词算法。
几个重要的分词器
3 使用IKAnalyzer2012分词和搜狗词库:
1 把IKAnalyzer2012FF_u1.jar包导入solr-web应用下的lib目录下solr4/example/solr-webapps/webapp/web-inf/lib/
2 把IKAnalyzer.cfg.xml和stopword.dic文件放置到solr-web类路径下(classes) solr4/example/solr-webapps/webapp/WEB-INF/classes/
3 修改solr的schema.xml 增加ik的引用
<!--配置IK分词器-->
<fieldType name="text_ik" class="solr.TextField">
<!--索引时候的分词器-->
<analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/> 创建索引时不使用最大分词器
<!--查询时候的分词器-->
<analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/> 查询时使用最大分词器
</fieldType>
其中索引则采用它的细粒度分词法,查询采用IK自己的最大分词法。
4 添加自定义词库
将sougou.dic无BOM utf8格式词库拷贝到solr4/example/solr-webapps/webapp/WEB-INF/classes/下和stopword.dic同级
修改solr/example/solr-webapps/webapp/WEB-INF/classes/IKAnalyzer.cfg.xml
添加sougou.dic 写绝对和相对路劲都可以 相对路径是相对IKAnalyzer.cfg.xml而言的
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典
<entry key="ext_dict">sougou.dic;</entry>
-->
<entry key="ext_dict">ext.dic;</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">stopword.dic;</entry>
</properties>
5 修改solr的schema.xml 将字段比如 name使用默认分词类型修改为 我们定义的 text_ik 重启solr 这样查询name的时候默认就使用text_ik我们的分词器了
ik查询结果图如下:
附件是修改好的 IKAnalyzer2012FF_u1.jar, schema.xml , sougou.dic , IKAnalyzer.cfg.xml