solr自定义分词器
来源:互联网 发布:mac book pro官网 编辑:程序博客网 时间:2024/06/10 16:26
一、概述
分析器(Analyzer)
分析器是包括两个部分:分词器和过滤器。
分词器顾名思意就是将句子分词单个的词
过滤器就是对分词的结果进行筛选,例如中文中将“的”“呀”这些对句子主体意思影响不大的词删除。英语中类似的就是”is”,”a”等等。
通常在索引和分词两端应该采用同样的分词器。solr自带了一些分词器,如果你需要使用自己公司的分词器,那么就需要修改solr模式(Solr schema)。
定义方式 (1)直接定义分词器 <fieldtype name="nametext" class="solr.TextField"> <analyzer class="org.apache.lucene.analysis.WhitespaceAnalyzer"/> </fieldtype> (2)定义分词器工厂和相关过滤器 <fieldtype name="text" class="solr.TextField"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StandardFilterFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StandardFilterFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldtype> (3)分词器和分词器工厂混合模式 <fieldtype name="text" class="solr.TextField"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StandardFilterFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="query" class="org.apache.lucene.analysis.WhitespaceAnalyzer"/> </fieldtype>
analyzer:在索引(index)单个文档和查询(query)时都被使用。它检查字段的文本并生成一个token流
tokenizers:读取字符流(Reader),把字段数据切分成序列化的Token流。它输出作为第一个Filter的输入(一个Analyzer只有一个Tokenizer)。
filters:检查tokens流,并且保持、转换或抛弃,或生成新的Token流。
二、自定义分词器(可以源码中的WhitespaceTokenizerFactory为例)
1、编写分词器工厂
(1)首先必须继承TokenizerFactory类。如:public class MyVerticalLineTokenizerFactory extends TokenizerFactory{}(2)编写自定义工厂类的构造方法(必须重写) public MyVerticalLineTokenizerFactory(Map<String,String> args) { //args集合即为配置中的相关属性,如<tokenizer useSmart="false" class="org.wltea.analyzer.lucene.IKTokenizerFactory"/> //则args的key为class和useSmart,super(args)会删除class。 super(args); rule = get(args, "rule", RULE_NAMES, RULE_JAVA);//从配置中取出rule配置,并将其从args中删除,默认为RULE_NAMES中的RULE_JAVA if (!args.isEmpty()) { throw new IllegalArgumentException("Unknown parameters: " + args); } }(3)重写抽象方法。 public Tokenizer create(AttributeFactory factory) { return new MyVerticalLineTokenizer(factory); }
2、编写tokenizer
(1)自定义分词器必须继承CharTokenizer类(或者Tokenizer)(2)重写构造方法 public MyVerticalLineTokenizer(AttributeFactory factory) { super(factory); }(3)重写isTokenChar方法,该方法控制了分词的字符,如下例中以逗号分隔 protected boolean isTokenChar(int c) { //逗号的ASCII值为44 return !(c == 44); }
3、编写filter
(1)自定义filter工厂类必须继承TokenFilterFactory类(2)重写构造方法 public MyTokenizerFilterFactory(Map<String, String> args) { super(args); }(3)重写抽象方法。 public TokenStream create(TokenStream input) { return new MyTokenizerFilter(input); }(4)自定义filter类必须继承TokenFilter(5)重写构造方法 protected MyTokenizerFilter(TokenStream input) { super(input); }(6)重写抽象方法。 public boolean incrementToken() throws IOException { if (input.incrementToken()) { charUtils.toUpperCase(termAtt.buffer(), 0, termAtt.length()); return true; } else return false; }
三、solr官方提供的相关分词器
1.solr.KeywordTokenizerFactory不管什么内容,整句当成一个关键字例如: "http://example.com/I-am+example?Text=-Hello" ==> "http://example.com/I-am+example?Text=-Hello"2.solr.LetterTokenizerFactory 根据字母来分词,抛弃非字母的部分 例如:"I can't" ==> "I", "can", "t"3.solr.WhitespaceTokenizerFactory 根据空格来分词 例如:"I do" ==> "I", "do"4.solr.LowerCaseTokenizerFactory根据字母分词,并将所有字母转换成小写,抛弃非字母的部分例如:"I can't" ==> "i", "can", "t"5.solr.StandardTokenizerFactory分词举例: "I.B.M. cat's can't" ==> ACRONYM: "I.B.M.", APOSTROPHE:"cat's", APOSTROPHE:"can't"说明:该分词器,会自动地给每个分词添加type,以便接下来的对type敏感的过滤器进行处理,目前仅仅只有StandardFilter对Token的类型是敏感的。6.solr.LowerCaseFilterFactory将分词小写,不处理非单词部分例如: "I.B.M.", "Solr" ==> "i.b.m.", "solr".
0 0
- solr 自定义分词器
- solr自定义分词器
- solr自定义分词器
- Solr自定义分词器
- solr自定义分词器
- Solr配置IK分词器自定义词库
- Solr自定义分词器-通过特殊字符分词
- solr中Analyzer(分词器)及其自定义
- [Nutch]Solr配置自定义的中文分词器mmseg4j
- Solr 中文分词器
- solr分词器
- solr 中文分词器
- solr配置中文分词器
- solr安装mmseg4j 分词器
- solr 中文分词器配置
- solr配置中文分词器
- solr集成IK分词器
- solr添加IKAnalyzer分词器
- leetcode 5. Longest Palindromic Substring Add to List
- oracle代码静态性能扫描
- 深入理解Java常用类----String(二)
- LeedCode 之 Merge Sorted Array
- Hadoop集群搭建(hadoop+zookeeper+hbase)Ubuntu14.04
- solr自定义分词器
- 如何封装RESTful Web Service
- 日志系统ELK使用详解(四)--kibana安装和使用
- Spring之使用JDOM读取XML文件
- java 常见错误&解决办法
- 计算一个字符串里数字、汉字、字母的个数
- UNIX环境高级编程习题——第三章
- linux常用命令
- ElsaticSearch增查改笔记