昨天晚上详细的说了说lucene的分析器,分词器,过滤器。今天我们来说说solr中的这三者吧。他是怎么基于lucene来写的。部分内容参见网上某文章
关于lucene的分析器,分词器,过滤器,请看:http://lianj-lee.javaeye.com/blog/501247
入正题:
对一个document进行索引时,其中的每个field中的数据都会经历分析(根据上面的一个博客可以知道,分析就是组合分词和过滤),最终将一句话分成单个的单词,去掉句子当中的空白符号,大写转换小写,复数转单数,去掉多余的词,进行同义词代换等等。
如:This is a blog! this, is, a 会被去除,最后最剩下blog。当然!这个符号也会被去除的。
这个过程是在索引和查询过程中都会进行的,而且通常两者进行的处理的都是一样的,这样做是为了保证建立的索引和查询的正确匹配。
分析器(Analyzer)
分析器是包括两个部分:分词器和过滤器。分词器功能将句子分成单个的词元token,过滤器就是对词元进行过滤。
solr自带了一些分词器,如果你需要使用自定义的分词器,那么就需要修改schema.xml文件。
schema.xml 文件允许两种方式修改文本被分析的方式,通常只有field类型为 solr.TextField 的field的内容允许定制分析器。
方法一:使用任何 org.apache.lucene.analysis.Analyzer的子类进行设定。
Xml代码 http://lianj-lee.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf?clipboard=%3CfieldType%20name%3D%22text%22%20class%3D%22solr.TextField%22%3E%20%20%0A%20%20%20%20%20%20%3Canalyzer%20class%3D%22org.wltea.analyzer.lucene.IKAnalyzer%22%2F%3E%20%20%0A%3C%2FfieldType%3E%20
方法二:指定一个TokenizerFactory ,后面跟一系列的TokenFilterFactories(它们将按照所列的顺序发生作用),Factories被用来创建分词器和分词过滤器,它们用 于对分词器和分词过滤器的准备配置,这样做的目的是为了避免the overhead of creation via reflection。
Xml代码 http://lianj-lee.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf?clipboard=%3Canalyzer%20type%3D%22index%22%3E%20%20%0A%20%20%20%20%20%20%20%20%3Ctokenizer%20class%3D%22org.wltea.analyzer.solr.IKTokenizerFactory%22%20isMaxWordLength%3D%22false%22%2F%3E%20%20%0A%E2%80%A6%E2%80%A6%20%20%0A%20%20%0A%20%20%20%20%3C%2Fanalyzer%3E%20%20%0A%20%20%20%20%3Canalyzer%20type%3D%22query%22%3E%20%20%0A%20%20%20%20%20%20%20%20%3Ctokenizer%20class%3D%22org.wltea.analyzer.solr.IKTokenizerFactory%22%20isMaxWordLength%3D%22true%22%2F%3E%20%20%0A%20%20%20%20%E2%80%A6%E2%80%A6%20%20%0A%20%20%20%20%3C%2Fanalyzer%3E%20
……
……
…… ……
需要说明的一点是,Any Analyzer, TokenizerFactory, or TokenFilterFactory 应该用带包名的全类名进行指定,请确保它们位于Solr的classpath 路径下。对于 org.apache.solr.analysis.* 包下的类,仅仅通过solr.*就可以进行指定。
如果你需要使用自己的分词器和过滤器,你就需要自己写一个 factory ,它必须是 BaseTokenizerFactory(分词器) 或BaseTokenFilterFactory(过滤器)的子类。就像下面一样。
Java代码 http://lianj-lee.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf?clipboard=public%20class%20MyFilterFactory%20extends%20BaseTokenFilterFactory%20%7B%0A%20%20public%20TokenStream%20create(TokenStream%20input)%20%7B%0A%20%20%20%20return%20new%20MyFilter(input)%3B%0A%20%20%7D%0A%7D%0A
public class MyFilterFactory extends BaseTokenFilterFactory {
public TokenStream create(TokenStream input) {
return new MyFilter(input);
}
}
public class MyFilterFactory extends BaseTokenFilterFactory { public TokenStream create(TokenStream input) { return new MyFilter(input); } }
对于IK3.1.5版本已经完全支持了solr的分词,这样就不用自己来编写了,而对于中文的切词的话,ik对solr的支持已经很完美了。
Solr提供了哪些TokenizerFactories?
1. solr.LetterTokenizerFactory
创建org.apache.lucene.analysis.LetterTokenizer.
分词举例:
"I can't" ==> "I", "can", "t",字母切词。
2. solr.WhitespaceTokenizerFactory
创建org.apache.lucene.analysis.WhitespaceTokenizer,主要是切除所有空白字符。
3. solr.LowerCaseTokenizerFactory
创建org.apache.lucene.analysis.LowerCaseTokenizer
分词举例:
"I can't" ==> "i", "can", "t",主要是大写转小写。
4. solr.StandardTokenizerFactory
创建org.apache.lucene.analysis.standard.StandardTokenizer
分词举例: "I.B.M. cat's can't" ==>
ACRONYM: "I.B.M.", APOSTROPHE:"cat's", APOSTROPHE:"can't"
说明:该分词器,会自动地给每个分词添加type,以便接下来的对type敏感的过滤器进行处理,目前仅仅只有StandardFilter对Token的类型是敏感的。
关键字: 搜索引擎 solr 分词
5. solr.HTMLStripWhitespaceTokenizerFactory
从结果中出去HTML标签,将结果交给WhitespaceTokenizer处理。
例子:
my link
my link
hello
hello
hello
hello
if a
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com