一切依旧 2016-03-12
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