ikanalyzer中科院分词器器改成c++ 版怎么做

Luence使用IKAnalyzer分词实例 及 IKAnalyzer扩展词库 - 推酷
Luence使用IKAnalyzer分词实例 及 IKAnalyzer扩展词库
基于配置的词典扩充
项目结构图如下:
IK分词器还支持通过配置IKAnalyzer.cfg.xml文件来扩充您的专有词典。谷歌拼音词库下载
在web项目的src目录下创建IKAnalyzer.cfg.xml文件,内容如下
&?xml version=&1.0& encoding=&UTF-8&?&
&!DOCTYPE properties SYSTEM &/dtd/properties.dtd&&
&properties&
&comment&IK Analyzer 扩展配置&/comment&
&!-- 用户可以在这里配置自己的扩展字典 --&
&entry key=&ext_dict&&/dicdata/use.dic./dicdata/googlepy.dic&/entry&
&!-- 用户可以在这里配置自己的扩展停止词字典
&entry key=&ext_stopwords&&/dicdata/ext_stopword.dic&/entry&
&/properties&
词典文件的编辑与部署
分词器的词典文件格式是无BOM&的UTF-8&编码的中文文本文件,文件扩展名不限。词典中,每个中文词汇独立占一行,使用\r\n&的DOS&方式换行。(注,如果您不了解什么是无BOM&的UTF-8&格式,&请保证您的词典使用UTF-8&存储,并在文件的头部添加一空行)。您可以参考分词器源码org.wltea.analyzer.dic&包下的.dic&文件。词典文件应部署在Java&的资源路径下,即ClassLoader&能够加载的路径中。(推荐同IKAnalyzer.cfg.xml&放在一起).
的词典扩充
在IKAnalyzer的与词条相关的操作
1.org.wltea.analyzer.cfg&
2.org.wltea.analyzer.dic&
org.wltea.analyzer.cfg下Configuration接口中的定义
  getExtDictionarys()
获取扩展字典配置路径
  getExtStopWordDictionarys() 获取扩展停止词典配置路径
  getMainDictionary() 获取主词典路径
  getQuantifierDicionary() 获取量词词典路径
org.wltea.analyzer.cfg.DefualtConfig类是对Configuration接口的实现
org.wltea.analyzer.dic下的Directory类中相关的方法
public void addWords(java.util.Collection&java.lang.String& words)
批量加载新词条
参数:words - Collection词条列表
public void disableWords(java.util.Collection&java.lang.String& words) 批量移除(屏蔽)词条
Lucene中使用IKAnalyzer分词器实例演示
package com.icrate.service.study.
@version : 1.0
&a href=&mailto:&&发送邮件&/a&
下午01:52:49
@function: TODO
public class Medicine {
public Medicine() {
public Medicine(Integer id, String name, String function) {
this.name =
this.function =
//getter and setter()
public String toString(){
return this.id + &,& +this.name + &,& + this.
构建模拟数据
package com.icrate.service.study.
import java.util.ArrayL
import java.util.L
@version : 1.0
&a href=&mailto:&&发送邮件&/a&
下午01:54:34
@function: TODO
public class DataFactory {
private static DataFactory dataFactory = new DataFactory();
private DataFactory(){
public List&Medicine& getData(){
List&Medicine& list = new ArrayList&Medicine&();
list.add(new Medicine(1,&银花 感冒颗粒&,&功能主治:银花感冒颗粒 ,头痛,清热,解表,利咽。&));
list.add(new Medicine(2,&感冒 止咳糖浆&,&功能主治:感冒止咳糖浆,解表清热,止咳化痰。&));
list.add(new Medicine(3,&感冒灵颗粒&,&功能主治:解热镇痛。头痛 ,清热。&));
list.add(new Medicine(4,&感冒灵胶囊&,&功能主治:银花感冒颗粒 ,头痛,清热,解表,利咽。&));
list.add(new Medicine(5,&仁和 感冒颗粒&,&功能主治:疏风清热,宣肺止咳,解表清热,止咳化痰。&));
public static DataFactory getInstance(){
return dataF
使用Lucene对模拟数据进行检索
package com.icrate.service.study.
import java.io.F
import java.io.IOE
import java.util.ArrayL
import java.util.L
import org.apache.lucene.analysis.A
import org.apache.lucene.document.D
import org.apache.lucene.document.F
import org.apache.lucene.index.IndexR
import org.apache.lucene.index.IndexW
import org.apache.lucene.index.IndexWriterC
import org.apache.lucene.index.T
import org.apache.lucene.queryParser.MultiFieldQueryP
import org.apache.lucene.search.IndexS
import org.apache.lucene.search.Q
import org.apache.lucene.search.ScoreD
import org.apache.lucene.search.TopD
import org.apache.lucene.search.highlight.F
import org.apache.lucene.search.highlight.F
import org.apache.lucene.search.highlight.H
import org.apache.lucene.search.highlight.QueryS
import org.apache.lucene.search.highlight.S
import org.apache.lucene.search.highlight.SimpleF
import org.apache.lucene.search.highlight.SimpleHTMLF
import org.apache.lucene.store.D
import org.apache.lucene.store.FSD
import org.apache.lucene.util.V
import org.wltea.analyzer.lucene.IKA
LuenceProcess.java
@version : 1.1
&a href=&mailto:&&发送邮件&/a&
Apr 3, 2013
11:48:11 AM
: Luence中使用IK分词器
public class LuceneIKUtil {
* 带参数构造,参数用来指定索引文件目录
* @param indexFilePath
public LuceneIKUtil(String indexFilePath){
directory = FSDirectory.open(new File(indexFilePath));
analyzer = new IKAnalyzer();
} catch (IOException e) {
e.printStackTrace();
* 默认构造,使用系统默认的路径作为索引
public LuceneIKUtil(){
this(&/luence/index&);
* 创建索引
* Description:
Apr 3, 2013
* @throws Exception
public void createIndex()throws Exception{
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_35,analyzer);
IndexWriter indexWriter = new IndexWriter(directory,indexWriterConfig);
indexWriter.deleteAll();
List&Medicine& list = DataFactory.getInstance().getData();
for(int i=0; i&list.size(); i++){
Medicine medicine = list.get(i);
Document document = addDocument(medicine.getId(), medicine.getName(), medicine.getFunction());
indexWriter.addDocument(document);
indexWriter.close();
* Description:
Apr 3, 2013
* @param id
* @param title
* @param content
public Document addDocument(Integer id, String name, String function){
Document doc = new Document();
//Field.Index.NO 表示不索引
//Field.Index.ANALYZED 表示分词且索引
//Field.Index.NOT_ANALYZED 表示不分词且索引
doc.add(new Field(&id&,String.valueOf(id),Field.Store.YES,Field.Index.NOT_ANALYZED));
doc.add(new Field(&name&,name,Field.Store.YES,Field.Index.ANALYZED));
doc.add(new Field(&function&,function,Field.Store.YES,Field.Index.ANALYZED));
* Description: 更新索引
Apr 3, 2013
* @param id
* @param title
* @param content
public void update(Integer id,String title, String content){
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_35,analyzer);
IndexWriter indexWriter = new IndexWriter(directory,indexWriterConfig);
Document document = addDocument(id, title, content);
Term term = new Term(&id&,String.valueOf(id));
indexWriter.updateDocument(term, document);
indexWriter.close();
} catch (Exception e) {
e.printStackTrace();
* Description:按照ID进行索引
Apr 3, 2013
* @param id
public void delete(Integer id){
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_35,analyzer);
IndexWriter indexWriter = new IndexWriter(directory,indexWriterConfig);
Term term = new Term(&id&,String.valueOf(id));
indexWriter.deleteDocuments(term);
indexWriter.close();
} catch (Exception e) {
e.printStackTrace();
* Description:查询
Apr 3, 2013
* @param where 查询条件
* @param scoreDoc 分页时用
public List&Medicine& search(String[] fields,String keyword){
IndexSearcher indexSearcher = null;
List&Medicine& result = new ArrayList&Medicine&();
//创建索引搜索器,且只读
IndexReader indexReader = IndexReader.open(directory,true);
indexSearcher = new IndexSearcher(indexReader);
MultiFieldQueryParser queryParser =new MultiFieldQueryParser(Version.LUCENE_35, fields,analyzer);
Query query = queryParser.parse(keyword);
//返回前number条记录
TopDocs topDocs = indexSearcher.search(query, 10);
//信息展示
int totalCount = topDocs.totalH
System.out.println(&共检索出 &+totalCount+& 条记录&);
//高亮显示
创建高亮器,使搜索的结果高亮显示
SimpleHTMLFormatter:用来控制你要加亮的关键字的高亮方式
此类有2个构造方法
1:SimpleHTMLFormatter()默认的构造方法.加亮方式:&B&关键字&/B&
2:SimpleHTMLFormatter(String preTag, String postTag).加亮方式:preTag关键字postTag
Formatter formatter = new SimpleHTMLFormatter(&&font color='red'&&,&&/font&&);
QueryScorer
QueryScorer 是内置的计分器。计分器的工作首先是将片段排序。QueryScorer使用的项是从用户输入的查询中得到的;
它会从原始输入的单词、词组和布尔查询中提取项,并且基于相应的加权因子(boost factor)给它们加权。
为了便于QueryScoere使用,还必须对查询的原始形式进行重写。
比如,带通配符查询、模糊查询、前缀查询以及范围查询 等,都被重写为BoolenaQuery中所使用的项。
在将Query实例传递到QueryScorer之前,可以调用Query.rewrite (IndexReader)方法来重写Query对象
Scorer fragmentScorer = new QueryScorer(query);
Highlighter highlighter = new Highlighter(formatter,fragmentScorer);
Fragmenter fragmenter = new SimpleFragmenter(100);
Highlighter利用Fragmenter将原始文本分割成多个片段。
内置的SimpleFragmenter将原始文本分割成相同大小的片段,片段默认的大小为100个字符。这个大小是可控制的。
highlighter.setTextFragmenter(fragmenter);
ScoreDoc[] scoreDocs = topDocs.scoreD
for(ScoreDoc scDoc : scoreDocs){
document = indexSearcher.doc(scDoc.doc);
Integer id = Integer.parseInt(document.get(&id&));
String name = document.get(&name&);
String function = document.get(&function&);
//float score = scDoc. //相似度
String lighterName = highlighter.getBestFragment(analyzer, &name&, name);
if(null==lighterName){
lighterName =
String lighterFunciton = highlighter.getBestFragment(analyzer, &function&, function);
if(null==lighterFunciton){
lighterFunciton =
Medicine medicine = new Medicine();
medicine.setId(id);
medicine.setName(lighterName);
medicine.setFunction(lighterFunciton);
result.add(medicine);
} catch (Exception e) {
e.printStackTrace();
indexSearcher.close();
} catch (IOException e) {
e.printStackTrace();
public static void main(String[] args) {
LuceneIKUtil luceneProcess = new LuenceIKUtil(&F:/index&);
luceneProcess.createIndex();
} catch (Exception e) {
e.printStackTrace();
//修改测试
luceneProcess.update(2, &测试内容&, &修改测试。。。&);
//查询测试
String [] fields = {&name&,&function&};
List&Medicine& list = luenceProcess.search(fields,&感冒&);
for(int i=0; i&list.size(); i++){
Medicine medicine = list.get(i);
System.out.println(&(&+medicine.getId()+&)&+medicine.getName() + &\t& + medicine.getFunction());
//删除测试
//luenceProcess.delete(1);
程序运行结果
加载扩展词典:/dicdata/use.dic.dic
加载扩展词典:/dicdata/googlepy.dic
加载扩展停止词典:/dicdata/ext_stopword.dic
共检索出 4 条记录
(1)银花 &font color='red'&感冒&/font&颗粒
功能主治:银花&font color='red'&感冒&/font&颗粒 ,头痛,清热,解表,利咽。
(4)&font color='red'&感冒&/font&灵胶囊
功能主治:银花&font color='red'&感冒&/font&颗粒 ,头痛,清热,解表,利咽。
(3)&font color='red'&感冒&/font&灵颗粒
功能主治:解热镇痛。头痛 ,清热。
(5)仁和 &font color='red'&感冒&/font&颗粒
功能主治:疏风清热,宣肺止咳,解表清热,止咳化痰。
如何判断索引是否存在
* 判断是否已经存在索引文件
* @param indexPath
boolean isExistIndexFile(String indexPath) throws Exception{
File file = new File(indexPath);
if (!file.exists()) {
file.mkdirs();
String indexSufix=&/segments.gen&;
//根据索引文件segments.gen是否存在判断是否是第一次创建索引
File indexFile=new File(indexPath+indexSufix);
return indexFile.exists();
IK分词处理过程
IK的整个分词处理过程首先,介绍一下IK的整个分词处理过程:
1.&Lucene的分词基类是Analyzer,所以IK提供了Analyzer的一个实现类IKAnalyzer。首先,我们要实例化一个IKAnalyzer,它有一个构造方法接收一个参数isMaxWordLength,这个参数是标识IK是否采用最大词长分词,还是采用最细粒度切分两种分词算法。实际两种算法的实现,最大词长切分是对最细粒度切分的一种后续处理,是对最细粒度切分结果的过滤,选择出最长的分词结果。
2.&IKAnalyzer类重写了Analyzer的tokenStream方法,这个方法接收两个参数,field&name和输入流reader,其中filed&name是Lucene的属性列,是对文本内容进行过分词处理和创建索引之后,索引对应的一个名称,类似数据库的列名。因为IK仅仅涉及分词处理,所以对field&name没有进行任何处理,所以此处不做任何讨论。
3.&tokenStream方法在Lucene对文本输入流reader进行分词处理时被调用,在IKAnalyzer的tokenStream方法里面仅仅实例化了一个IKTokenizer类,该类继承了Lucene的Tokenizer类。并重写了incrementToken方法,该方法的作用是处理文本输入流生成token,也就是Lucene的最小词元term,在IK里面叫做Lexeme。
4.&在IKtokenizer的构造方法里面实例化了IK里面最终要的分词类IKSegmentation,也称为主分词器。它的构造方法接收两个参数,reader和isMaxWordLength。
5.&IKsegmentation的构造方法里面,主要做了三个工作,创建上下文对象Context,加载词典,创建子分词器。
6.&Contex主要是存储分词结果集和记录分词处理的游标位置。
7.&词典是作为一个单例被创建的,主要有量词词典、主词典和停词词典。词典是被存储在字典片段类DictSegment&这个字典核心类里面的。DictSegment有一个静态的存储结构charMap,是公共词典表,用来存储所有汉字,key和value都是一个中文汉字,目前IK里面的charMap大概有7100多的键值对。另外,DictSegment还有两个最重要的数据结构,是用来存储字典树的,一个是DictSegment的数组childrenArray,另一个是key为单个汉字(每个词条的第一个汉字),value是DictSegment的HashMap&childrenMap。这两个数据结构二者取其一,用来存储字典树。
8.&子分词器才是真正的分词类,IK里面有三个子分词器,量词分词器,CJK分词器(处理中文),停词分词器。主分词器IKSegmentation遍历这三个分词器对文本输入流进行分词处理。
9.&IKTokenizer的incrementToken方法调用了IKSegmentation的next方法,next的作用是获得下一个分词结果。next在第一次被调用的时候,需要加载文本输入流,并将其读入buffer,此时便遍历子分词器,对buffer种的文本内容进行分词处理,然后把分词结果添加到context的lexemeSet中。
转转请注明出处:[
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
排版有问题
没有分页内容
视频无法显示
图片无法显示当前访客身份:游客 [
学无止境,脚踏实地,不耻下问!
:版主,我想請問一下,如果我在報表上加parameter...
:还要注意下 系统级别防火墙 iptables
:能发一个源码吗,最近在学习jaspereport,谢谢 ...
:屌爆了!复制过去就能用。
:一个页面可以包含多个ng-app标记?能给个示例吗?...
:楼主的意思是吧web.xml中原来的org.apache.stru...
:文件上传其实和框架没有很大关系,重点是request...
:引用来自“枫亭”的评论感觉楼主分享,困惑了很久...
:感觉楼主分享,困惑了很久的问题,终于解决了。 ...
今日访问:121
昨日访问:152
本周访问:402
本月访问:530
所有访问:46127
Lucene使用IKAnalyzer中文分词笔记
发表于1年前( 17:08)&&
阅读(3113)&|&评论()
0人收藏此文章,
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。
本文主要讲解IKAnalyzer(以下简称‘IK’)在Lucene中的具体使用,关于Lucene和IK分词器的背景及其作用在这里就不再熬述。不得不感叹下Lucene版本变更的快速,如今最新已经到了4.9.0,相信任何技术的发展壮大都不可避免有这一过程。本文使用的是Lucene4.0,IKAnalyzer使用的是2012FF版。
Lucene下载请移步官网,IK下载地址如下:
& &IK下载完成够拷贝至项目中,目录结构如下图所示:
可以看到src目录下有三个配置文件,分别为扩展字典文件ext.dic,停止词字典文件stopwprd.dic和配置文件IKAnalyzer.cfg.xml。配置文件IKAnalyzer.cfg.xml为配置扩展字典文件和停止词字典文件路径。IKAnalyzer.cfg.xml文件默认放置在classpath的根目录下,可以修改源码来改变该文件位置。
在程序中使用IK很简单,只需要创建IKAnalyzer对象即可,因为IKAnalyzer继承于Lucene的Analyzer。
IK无参构造函数默认采用细粒度切分算法,
Analyzer analyzer = new IKAnalyzer();//细粒度切分算法
当然也可以传入参数设置采用智能切分算法。
Analyzer analyzer = new IKAnalyzer(true);//智能切分
Demo例子如下:
import&java.io.IOE
import&org.apache.lucene.analysis.A
import&org.apache.lucene.document.D
import&org.apache.lucene.document.F
import&org.apache.lucene.document.StringF
import&org.apache.lucene.document.TextF
import&org.apache.lucene.index.CorruptIndexE
import&org.apache.lucene.index.DirectoryR
import&org.apache.lucene.index.IndexR
import&org.apache.lucene.index.IndexW
import&org.apache.lucene.index.IndexWriterC
import&org.apache.lucene.index.IndexWriterConfig.OpenM
import&org.apache.lucene.queryparser.classic.ParseE
import&org.apache.lucene.queryparser.classic.QueryP
import&org.apache.lucene.search.IndexS
import&org.apache.lucene.search.Q
import&org.apache.lucene.search.ScoreD
import&org.apache.lucene.search.TopD
import&org.apache.lucene.store.D
import&org.apache.lucene.store.LockObtainFailedE
import&org.apache.lucene.store.RAMD
import&org.apache.lucene.util.V
import&org.wltea.analyzer.lucene.IKA
&*&使用IKAnalyzer进行Lucene索引和查询的演示
&*&以下是结合Lucene4.0&API的写法
public&class&LuceneIndexAndSearchDemo&{
&*&创建一个单条记录的索引,并对其进行搜索
&*&@param&args
public&static&void&main(String[]&args){
//Lucene&Document的域名
String&fieldName&=&&text&;
&//检索内容
String&text&=&&IK&Analyzer是一个结合词典分词和文法分词的中文分词开源工具包。它使用了全新的正向迭代最细粒度切分算法。&;
//实例化IKAnalyzer分词器
Analyzer&analyzer&=&new&IKAnalyzer(true);
Directory&directory&=&
IndexWriter&iwriter&=&
IndexReader&ireader&=&
IndexSearcher&isearcher&=&
//建立内存索引对象
directory&=&new&RAMDirectory(); &
//配置IndexWriterConfig
IndexWriterConfig&iwConfig&=&new&IndexWriterConfig(Version.LUCENE_40&,&analyzer);
iwConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
iwriter&=&new&IndexWriter(directory&,&iwConfig);
//写入索引
Document&doc&=&new&Document();
doc.add(new&StringField(&ID&,&&10000&,&Field.Store.YES));
doc.add(new&TextField(fieldName,&text,&Field.Store.YES));
iwriter.addDocument(doc);
iwriter.close();
//搜索过程**********************************
&&&&//实例化搜索器&&&
ireader&=&DirectoryReader.open(directory);
isearcher&=&new&IndexSearcher(ireader);
String&keyword&=&&中文分词工具包&;
//使用QueryParser查询分析器构造Query对象
QueryParser&qp&=&new&QueryParser(Version.LUCENE_40,&fieldName,&&analyzer);
qp.setDefaultOperator(QueryParser.AND_OPERATOR);
Query&query&=&qp.parse(keyword);
System.out.println(&Query&=&&&+&query);
//搜索相似度最高的5条记录
TopDocs&topDocs&=&isearcher.search(query&,&5);
System.out.println(&命中:&&+&topDocs.totalHits);
//输出结果
ScoreDoc[]&scoreDocs&=&topDocs.scoreD
for&(int&i&=&0;&i&&&topDocs.totalH&i++){
Document&targetDoc&=&isearcher.doc(scoreDocs[i].doc);
System.out.println(&内容:&&+&targetDoc.toString());
}&catch&(CorruptIndexException&e)&{
e.printStackTrace();
}&catch&(LockObtainFailedException&e)&{
e.printStackTrace();
}&catch&(IOException&e)&{
e.printStackTrace();
}&catch&(ParseException&e)&{
e.printStackTrace();
}&finally{
if(ireader&!=&null){
ireader.close();
}&catch&(IOException&e)&{
e.printStackTrace();
if(directory&!=&null){
directory.close();
}&catch&(IOException&e)&{
e.printStackTrace();
&&&&看看代码,IK的使用真的很简单。其实该例子的代码就在IK包org/wltea/analyzer/sample/下。关于Lucene的使用可参看另一篇文章,文章地址:
更多开发者职位上
1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读IKAnalyzer中文分词器V3.2.8使用手册_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
IKAnalyzer中文分词器V3.2.8使用手册
上传于||文档简介
&&I&#8203;K&#8203;A&#8203;n&#8203;a&#8203;l&#8203;y&#8203;z&#8203;e&#8203;r&#8203;中&#8203;文&#8203;分&#8203;词&#8203;器&#8203;的&#8203;使&#8203;用&#8203;方&#8203;法
阅读已结束,如果下载本文需要使用
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩15页未读,继续阅读
你可能喜欢全文检索(5)
& & & IKAnalyzer1.3.4要自定义我们自己的词库,而且我们可以随时新增分词,网上查了一圈没有相关资料,看来只有自己搞定了。这里大家需要熟悉HTTP协议中的Last-Modified、ETags这些概念,这样能更容易理解IKAnalyzer作者的设计思路。
& & & 观察了下IKAnalyzer分词器的配置文件IKAnalyzer.cfg.xml发现其中有这样一个选项:
&!--用户可以在这里配置远程扩展字典 --&&entry key=&remote_ext_dict&&&entry&,而且作者做了注释说这个就是扩展远程词典的。于是打开IKAnalyzer的源码查看,最后在Dictronary这类下找到这个方法:getRemoteWords。经过查看发现其实用的是HttpClient去获取分词。于是我就用SpringMVC写了个Controller来解决。这里要注意:每个分词之间要使用换行符即“\r\n”来分割,貌&#20284;问题圆满解决,
& & & & 可是,我发现IKAnalyzer的这个获取分词的动作只是在启动的时候去访问我写的Controller。很显然这是不行的,这就违背了我随时新增分词的愿望了,看来我要扩展这个分词器了。于是我开始从头翻这个开源分词器的源码,我在Dictronary最后找到以下的代码,顿时让我&#30524;前一亮:
& & public void reLoadMainDict(){
& & </(&重新加载词典...&);
& & & & loadMainDict();
& & & & loadStopWordDict();
& & & & 顾名思义,这个是重载分词的。于是我问自己,什么时候重载?如何重载?于是我搜了下,最后再Monitor这个类下找到run这个方法,这是Monitor实现Runnable接口的,在这个方法里这个分词器先去构造httphead,并且带上If-None-Match、If-Modified-Since这俩参数去访问Controller(关于这俩参数的概念,大家可以上网查),然后根据返回来的response的head里的Last-Modified和ETags来和Monitor缓存的变量进行比较,如果任何一个不相同就需要重新访问Controller中去获取数据,说到这里可以总下:可以在服务端(Controller)中设置这俩变量,来控制IKAnalyzer是否重新加载分词。OK,分析到这里问题解决了。最后我写的Controller中代码大概如下:
* 获取分词
@RequestMapping(&getDict&) &
@ResponseBody &
public String getDict(HttpServletRequest request, HttpServletResponse response) {
& & & & &String result = &&;
& & & & &StringBuilder sb = new StringBuilder();
& & & & &List&Word& wordList = wordService.selectAllWord();//获取所有分词,这里可以改进使用缓存等。
& & & & &String eTag = request.getHeader(&If-None-Match&);
& & & & &Long modified= request.getDateHeader(&If-Modified-Since&);
& & & & &//设置头
& & & & &if(null == modified || -1 == modified) {
& & & & & & & //如果没有,则使用当前时间&
& & & & & & & modified = System.currentTimeMillis();
& & & & &}
& & & & &/ /设置头信息。
& & & & &String oldEtag = wordList.size() &#43; &&;
& & & & &response.setDateHeader(&Last-Modified&, Long.valueOf(modified));
& & & & &response.setHeader(&ETags&, wordList.size() &#43; &&);
& & & & &if(!oldEtag.equals(eTag)) {
& & & & & & & //拼装结果
& & & & & & & for(Word tempWord : wordList) {
& & & & & & & & & &//分词之间以换行符连接
& & & & & & & & & &if(StringUtils.isNotEmpty(sb.toString())) {
& & & & & & & & & & & & & & sb.append(&\r\n&);
& & & & & & & & & &}
& & & & & & & & & sb.append(tempWord.getValue());
& & & & & & & }
& & & & & & & &result = sb.toString();
& & & & & & & &//更新时间
& & & & & & & &response.setDateHeader(&Last-Modified&, System.currentTimeMillis());
& & & &这里还可以再优化,这是后话了,有了这个思路其余的都是锦上添花。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:137669次
积分:2786
积分:2786
排名:第7351名
原创:98篇
评论:51条
(6)(4)(7)(6)(2)(5)(3)(3)(9)(4)(3)(5)(5)(4)(2)(1)(3)(2)(1)(2)(3)(1)(3)(1)(1)(3)(1)(2)(2)(4)(1)

我要回帖

更多关于 ikanalyzer分词器 的文章

 

随机推荐