lucene中StandardAnalyzer的理解
分析器Analyzer
分词器Tokenizer
过滤器Filter
Tokenizer负责把词分开
Filter负责对分开的词进行处理
Analyzer包装组合Tokenizer和Filter以满足特定的分词需求
力琦已经写了几种不同的
WhitespaceAnalyzer();
SimpleAnalyzer();
StopAnalyzer();
StandardAnalyzer();
其中前三个的切分比较简单,只以空格作为分隔符,这里我就不打算解释了.
重点是StandardAnalyzer();
被这个分析器作用后,像这句话"we are 中国人"就会变成"[we] [are] [中] [国] [人]"
明显看到他根本就没有对中文进行词级上的切分,只是笼统地进行字切分.
那为什么呢?还是从代码上解释吧:
在/src/java/org/apache/lucene/analysis下我们可以看到有独立的一个包standard
就知道这个分析器有多么特别了。里面有一个文件StandardTokenizer.jj
整个决定性的东西都在里面了,
其中的
<ALPHANUM: (<LETTER>|<DIGIT>|<KOREAN>)+ >
//说明了英语的匹配正则表达
| < CJ: // Chinese, Japanese
[
"/u3040"-"/u318f",
"/u3300"-"/u337f",
"/u3400"-"/u3d2d",
"/u4e00"-"/u9fff",
"/uf900"-"/ufaff"
]
>
说明了中文字符的unicode的范围(跟日文放在一起了),而且是一个字符成为一个token的.
然后我们再看看
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case ALPHANUM:
token = jj_consume_token(ALPHANUM);
break;
//...........中间省略了无数行
case CJ:
token = jj_consume_token(CJ);
break;
case 0:
token = jj_consume_token(0);
break;
.......
可以看到,每遇到一个中文字,就进行分词
还是举个例子吧!不然估计很多人都会晕了的.
"we are 中国人"这个例子
由于<ALPHANUM: (<LETTER>|<DIGIT>|<KOREAN>)+ >(注意后面的这个加号)
所以we是一个token,遇到空格,是正则匹配到此为止,再下一次成功匹配are,遇到空格,得到另一个token:are
然后倒了"中",由于是CJ,所以只是两个字节的,直接匹配成功,进到下一个匹配"国".
如果对这个jj文件有所改动,就要用JavaCC(JavaCompilerCompiler,纯Java的词法分析生成器)重新生成几个重要的.java文件了.
lucene中StandardAnalyzer的理解相关推荐
- 浅谈Lucene中的DocValues
2019独角兽企业重金招聘Python工程师标准>>> 前言: 在Lucene4.x之后,出现一个重大的特性,就是索引支持DocValues,这对于广大的solr和elasticse ...
- Lucene 中的Tokenizer, TokenFilter学习
https://brandnewuser.iteye.com/blog/2305140 lucene中的TokenStream,TokenFilter之间关系 TokenStream是一个能够在被调用 ...
- Apache Lucene中的并发查询执行
Apache Lucene是一个出色的并发纯Java搜索引擎,如果您愿意,它可以轻松地使服务器上的可用CPU或IO资源饱和. "典型" Lucene应用程序的并发模型在搜索时每个查 ...
- lucene中的nrt
NRT原理 When you ask for the IndexReader from the IndexWriter, the IndexWriter will be flushed (docs a ...
- 搜索中的 Query 理解及应用
文章作者:Joelchen 腾讯 研究员 编辑整理:Hoh 内容来源:腾讯技术工程 出品平台:DataFunTalk 注:转载请联系原作者. 导读:Query 理解 ( QU,Query Unders ...
- fst 共享后缀_谈谈lucene中的FST
FST是lucene中用来存储字典,并进行检索的核心数据结构,我记得在lucene3.0版本前都用的是跳跃链表(不清楚的同学以后我会专门写一篇磁盘索引技术来说清楚,网上也有相关资料),实际上采用该数据 ...
- javascript中 (function(){})();如何理解?
javascript中 (function(){})();如何理解? javascript中: (function(){})()是匿名函数,主要利用函数内的变量作用域,避免产生全局变量,影响整体页面环 ...
- java抽象的理解_Java中抽象类的理解
Java中抽象类的理解 创建 所有 bsp 抽象类 member 初始 dem print ---------------------------------------- ...
- Java中 多态的理解
** Java中 多态的理解 ** 多态官方定义为: 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指 ...
最新文章
- python for 循环 多线程_python:for循环中的多线程处理
- 会话(cookie的使用,路径和Session的工作原理,使用)
- 中国海上风力发电行业战略调研与投资风险分析报告2022-2028年
- Allegro转Altium(brd2alg)
- linux centos7完整记录对根目录的磁盘扩容过程(扩容99G)
- 十大经典排序算法之快速排序及其优化
- 二次规划的一个很好的课件网站
- 经典C语言程序100例之九四
- SQL存储过程实例具体解释
- leetcode 398. Random Pick Index | 398. 随机数索引(Java)
- 记录一个自动创建分区的脚本
- SP22343 NORMA2 - Norma(分治优化复杂度)
- akka的介绍_Akka笔记–演员介绍
- 【Python 标准库学习】日期和时间处理库 — datetime
- pytorch查看应用指数衰减后的学习率
- 顺丰不行了吗?对快递行业的深度理解
- Linux 在 M1 上跑起来了
- scrapy框架之分布式操作
- 一次redis乱用导致的事故现场
- 如果发现CSDN资源有问题,可以进行举报