`
qindongliang1922
  • 浏览: 2175729 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117236
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:125615
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:59661
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71115
社区版块
存档分类
最新评论

Lucene4.3开发之第四步之脱胎换骨(四)

阅读更多
  为防止,一些小网站私自盗用原文,请支持原创
  原文永久链接:http://qindongliang1922.iteye.com/blog/1922742
 
前面几章笔者把Lucene基本入门的任督二脉给打通了,从此篇开始,就开始进行Lucene的进阶开发了,那么首先摆在我们面前的第一个必须要解决的问题,就是关于中文分词的问题,因为Lucene毕竟是国外的大牛们开发的,显然会比较侧重英文文章,不过还好,在Lucene的下载包里同步了SmartCN的分词器针对中文发行的,每一次Lucene有新的版本发行,这个包同时更新。

笔者比较推荐的中文分词器是IK分词器,在进入正式的讲解之前,我们首先对Lucene里面内置的几个分析器做个了解.

分析器类型基本介绍
WhitespaceAnalyzer以空格作为切词标准,不对语汇单元进行其他规范化处理
SimpleAnalyzer以非字母符来分割文本信息,并将语汇单元统一为小写形式,并去掉数字类型的字符
StopAnalyzer该分析器会去除一些常有a,the,an等等,也可以自定义禁用词
StandardAnalyzerLucene内置的标准分析器,会将语汇单元转成小写形式,并去除停用词及标点符号
CJKAnalyzer能对中,日,韩语言进行分析的分词器,对中文支持效果一般。
SmartChineseAnalyzer对中文支持稍好,但扩展性差


评价一个分词器的性能优劣,关键是看它的切词效率以及灵活性,及扩展性,通常情况下一个良好的中文分词器,应该具备扩展词库,禁用词库和同义词库,当然最关键的是还得要与自己的业务符合,因为有些时候我们用不到一些自定义词库,所以选择分词器的时候就可以不考虑这一点。IK官网发布的最新版IK分词器对于Lucene的支持是不错的,但是对于solr的支持就不够好了,需要自己改源码支持solr4.x的版本。笔者使用的另一个IK包是经过一些人修改过的可以支持solr4.3的版本,并对扩展词库,禁用词库,同义词库完全支持,而且在solr里面配置很简单,只需要在schmal.xml进行简单配置,即可使用IK分词器的强大的定制化功能。不过官网上IK作者发布的IK包在lucene里面确都不支持同义词库扩展的功能,如果你想使用,得需要自己修改下源码了,不过即使自己修改扩展同义词也是非常容易的。


下面笔者给出使用官网最后一版发布的IK在Lucene中做的测试,笔者使用的已经扩展了同义词库部分,后面会给出源码。

下面先看第一个纯分词的测试
package com.ikforlucene;

import java.io.StringReader;

import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;


public class Test {
	
	 
	public static void main(String[] args)throws Exception {
                      //下面这个分词器,是经过修改支持同义词的分词器
		  IKSynonymsAnalyzer analyzer=new IKSynonymsAnalyzer();
		   String text="三劫散仙是一个菜鸟";
		   TokenStream ts=analyzer.tokenStream("field", new StringReader(text));
			CharTermAttribute term=ts.addAttribute(CharTermAttribute.class);
			ts.reset();//重置做准备
			while(ts.incrementToken()){
				System.out.println(term.toString());
			}
			ts.end();//
			ts.close();//关闭流
		
		 
	}

}

运行结果:
三
劫
散
仙
是
一个
菜鸟


第二步,测试扩展词库,使三劫为一个词,散仙为一个词,需要在同义词库里添加三劫,散仙(注意是按行读取的),注意保存的格式为UTF-8或无BOM格式即可



添加扩展词库后运行结果如下:
三劫
散仙
是
一个
菜鸟


第三步,测试禁用词库,我们把菜鸟二个字给屏蔽掉,每行一个词,保存格式同上.


添加禁用词库后运行结果如下:
三劫
散仙
是
一个


最后我们再来测试下,同义词部分,现在笔者把河南人,洛阳人作为"一个"这个词的同义词,添加到同义词库中(笔者在这里仅仅是做一个测试,真正生产环境中的同义词肯定是正式的),注意同义词,也是按行读取的,每行的同义词之间使用逗号分割。


添加同义词库后运行结果如下:
三劫
散仙
是
一个
河南人
洛阳人


至此,使用IK在Lucene4.3中大部分功能都已测试通过,下面给出扩展同义词部分的源码,有兴趣的道友们,可以参照借鉴下。

package com.ikforlucene;

import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;
import java.util.Map;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.synonym.SynonymFilterFactory;
import org.apache.solr.core.SolrResourceLoader;
import org.wltea.analyzer.lucene.IKTokenizer;
/**
 * 可以加载同义词库的Lucene
 * 专用IK分词器
 * 
 * 
 * */
public class IKSynonymsAnalyzer extends Analyzer {

	 
	@Override
	protected TokenStreamComponents createComponents(String arg0, Reader arg1) {
		
		Tokenizer token=new IKTokenizer(arg1, true);//开启智能切词
		
		Map<String, String> paramsMap=new HashMap<String, String>();
		paramsMap.put("luceneMatchVersion", "LUCENE_43");
		paramsMap.put("synonyms", "E:\\同义词\\synonyms.txt");
		SynonymFilterFactory factory=new SynonymFilterFactory(paramsMap);
		 SolrResourceLoader loader=	new SolrResourceLoader("");
		try {
			factory.inform(loader);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	 
		return new TokenStreamComponents(token, factory.create(token));
	}
	
	
	

}

关于同义词部分的使用,各位道友,可以先去官网上下载源码,然后将此同义词扩展部分放进去即可,非常简单方便。
  • 大小: 18.6 KB
  • 大小: 19.9 KB
  • 大小: 19.6 KB
6
1
分享到:
评论
12 楼 flashing 2015-05-08  
ansjsun 写道
fengbin2005 写道
qindongliang1922 写道
ansjsun 写道
qindongliang1922 写道
ansjsun 写道
不错。。写的很详细。。还有一种情况
假如我词典中有词

“中国银行”---》搜索“中国”的时候是出不来的。。想听听楼主的解决方案



关于中国银行这个词,建议开启最细粒度切分,可以切分成,中国,银行,中国银行,可以解决此类问题


那"旅游和服务"-->会被分成--旅游/和服/服务

又该怎么解决呢?



我觉得如果这是一篇没有和和服有关的东西,那么可以把和服作为禁用词库里,或者把和作为禁用词处理,请教一下这种问题在ansj里面怎么处理?

我觉得可以将"和"作为噪字,先除噪处理.那么切出来就是 旅游 ,服务 了.

我穿和服很好看..


的确,五道口交警这种问题,不光是分词,还有语义啊。
11 楼 yibuyimeng 2014-11-21  
楼主,敢分享下IK的jar包吗,我找了很久没有和你demo一样的IK jar包!可以的话,yibuyimeng@163.com
10 楼 fncj 2014-02-14  
fncj 写道
很好,顶一个,同义词部分建议讲细点,不是很明白。

LZ可以说说自己思路,谢谢
9 楼 fncj 2014-02-14  
很好,顶一个,同义词部分建议讲细点,不是很明白。
8 楼 RRobinson 2013-12-20  
散仙我想问一下,你的同义词synonyms.txt  里面此时怎么排版的啊
7 楼 ansjsun 2013-08-15  
fengbin2005 写道
qindongliang1922 写道
ansjsun 写道
qindongliang1922 写道
ansjsun 写道
不错。。写的很详细。。还有一种情况
假如我词典中有词

“中国银行”---》搜索“中国”的时候是出不来的。。想听听楼主的解决方案



关于中国银行这个词,建议开启最细粒度切分,可以切分成,中国,银行,中国银行,可以解决此类问题


那"旅游和服务"-->会被分成--旅游/和服/服务

又该怎么解决呢?



我觉得如果这是一篇没有和和服有关的东西,那么可以把和服作为禁用词库里,或者把和作为禁用词处理,请教一下这种问题在ansj里面怎么处理?

我觉得可以将"和"作为噪字,先除噪处理.那么切出来就是 旅游 ,服务 了.

我穿和服很好看..
6 楼 fengbin2005 2013-08-14  
qindongliang1922 写道
ansjsun 写道
qindongliang1922 写道
ansjsun 写道
不错。。写的很详细。。还有一种情况
假如我词典中有词

“中国银行”---》搜索“中国”的时候是出不来的。。想听听楼主的解决方案



关于中国银行这个词,建议开启最细粒度切分,可以切分成,中国,银行,中国银行,可以解决此类问题


那"旅游和服务"-->会被分成--旅游/和服/服务

又该怎么解决呢?



我觉得如果这是一篇没有和和服有关的东西,那么可以把和服作为禁用词库里,或者把和作为禁用词处理,请教一下这种问题在ansj里面怎么处理?

我觉得可以将"和"作为噪字,先除噪处理.那么切出来就是 旅游 ,服务 了.
5 楼 guduxing890 2013-08-14  
抱歉, 提个小小建议。 可否更改一下字体大小。 感觉字体太大了。 有点密集
4 楼 qindongliang1922 2013-08-10  
ansjsun 写道
qindongliang1922 写道
ansjsun 写道
不错。。写的很详细。。还有一种情况
假如我词典中有词

“中国银行”---》搜索“中国”的时候是出不来的。。想听听楼主的解决方案



关于中国银行这个词,建议开启最细粒度切分,可以切分成,中国,银行,中国银行,可以解决此类问题


那"旅游和服务"-->会被分成--旅游/和服/服务

又该怎么解决呢?



我觉得如果这是一篇没有和和服有关的东西,那么可以把和服作为禁用词库里,或者把和作为禁用词处理,请教一下这种问题在ansj里面怎么处理?
3 楼 ansjsun 2013-08-10  
qindongliang1922 写道
ansjsun 写道
不错。。写的很详细。。还有一种情况
假如我词典中有词

“中国银行”---》搜索“中国”的时候是出不来的。。想听听楼主的解决方案



关于中国银行这个词,建议开启最细粒度切分,可以切分成,中国,银行,中国银行,可以解决此类问题


那"旅游和服务"-->会被分成--旅游/和服/服务

又该怎么解决呢?
2 楼 qindongliang1922 2013-08-09  
ansjsun 写道
不错。。写的很详细。。还有一种情况
假如我词典中有词

“中国银行”---》搜索“中国”的时候是出不来的。。想听听楼主的解决方案



关于中国银行这个词,建议开启最细粒度切分,可以切分成,中国,银行,中国银行,可以解决此类问题
1 楼 ansjsun 2013-08-09  
不错。。写的很详细。。还有一种情况
假如我词典中有词

“中国银行”---》搜索“中国”的时候是出不来的。。想听听楼主的解决方案

相关推荐

    lucene4.3源码

    Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎...

    lucene4.3 按坐标距离排序

    4. **Spatial Query**:Lucene提供了多种查询类型,如`CircleQuery`或`RectangleQuery`,用于指定一个地理区域并检索该区域内或与之相关的文档。这些查询可以结合排序来返回最近的文档。 5. **Sorting**:在Lucene...

    lucene4.3工具类

    lucene4.3增删改查的的一个工具类,对新手来说是一份不可多得的入门资料。

    lucene 4.3所用到的包

    全文检索lucene 4.3 所用到的3个jar包,包含lucene-queryparser-4.3.0.jar、 lucene-core-4.3.0.jar、lucene-analyzers-common-4.3.0.jar。

    Lucene4.3src 源代码

    lucene4.3源代码 censed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information ...

    lucene-4.3.1资源

    4. **评分与排序**:Lucene根据相关性对匹配的文档进行评分,并按照评分进行排序,返回最相关的搜索结果。 5. **结果展示**:最后,开发者需要处理返回的结果集,将其转化为用户友好的形式,如网页上的列表。 在...

    基于lucene4.3的知识图谱搜索引擎XunTa(一种用"知识点"来找人的搜人引擎).zip

    1.XunTa是在lucene4.3上创建的通过“知识点”来找人的搜人引擎。  输入一个关键词(或组合),XunTa返回一个排名列表,排在前面的人是与该关键词(组合)最相关的“达人”。  可访问 http://www.xunta.so立即体验...

    lucene的IKAnalyzer以及兼容4.3

    本文将深入探讨IKAnalyzer的特性和其在Lucene 4.3中的兼容性问题及其解决方案。 **IKAnalyzer简介** IKAnalyzer( Intelligent Keyword Analyzer)是一款基于Java实现的中文分词工具,它主要针对中文的特性进行了...

    基于lucene的开发JavaEE项目

    《基于Lucene的JavaEE项目开发详解》 在信息技术领域,搜索引擎已经成为不可或缺的一部分,而Lucene作为开源全文搜索引擎库,以其高效、灵活的特点被广泛应用于各种JavaEE项目中。本项目将深入探讨如何利用Lucene...

    Lucene3.4开发入门.pdf

    Lucene3.4开发入门.pdf

    lucene2.9开发指南

    - **建立索引**:这是Lucene搜索的第一步,涉及将数据转换为可搜索的索引结构。这通常包括读取数据源(如文件或数据库),然后将内容解析为文档,并使用分析器对文档内容进行分词。 - **搜索索引**:一旦索引建立...

    Lucene.net开发最全文档

    **Lucene.net 开发完全指南** Lucene.net 是一个开源的全文搜索引擎库,它是 Apache Lucene 的 .NET 版本,适用于 .NET 平台。Lucene.net 提供了高效、可扩展的搜索功能,广泛应用于网站内容检索、文档搜索、数据库...

    Lucene开发详解.pdf

    ### Lucene开发详解 #### 一、Lucene简介 Lucene是一个高性能、全功能的文本搜索引擎库,由Doug Cutting创建并捐赠给Apache Software Foundation。它主要用于构建全文搜索应用程序,能够帮助开发者快速地在其应用...

    基于lucene.net开发的个人知识库

    《基于Lucene.Net开发的个人知识库》 在信息技术领域,高效的信息检索和管理是至关重要的。Lucene.Net,作为Apache Lucene项目的一个.NET版本,为开发者提供了强大的全文搜索引擎库,使得开发者能够轻松构建自己的...

    Lucene开发手册

    【Lucene开发手册】 Lucene是一个开源的全文检索库,由Apache软件基金会开发,主要用Java编写。作为一套API,Lucene提供了构建高效、可扩展的搜索引擎所需的核心工具。它并非一个完整的搜索引擎产品,而是一个搜索...

    lucene开发流程

    开发流程的第一步是从各种数据源(如新闻、论坛、博客)中获取信息。这通常涉及到与数据库交互,通过SQL查询或API接口来获取需要的数据。 2. **数据预处理**: 获取到原始数据后,需要对其进行预处理,这包括读取...

    Lucene搜索引擎开发权威经典(附盘源码)【于天恩】.zip

    《Lucene搜索引擎开发权威经典》是由于天恩编著的一本深入探讨Lucene搜索引擎开发的专业书籍,这本书结合源码分析,旨在帮助读者掌握Lucene的核心技术和应用实践。Lucene是Apache软件基金会的一个开放源代码项目,它...

    Lucene开发指南

    《Lucene开发指南》是一份综合性的学习资料,旨在帮助开发者深入理解和熟练运用Apache Lucene这一强大的全文搜索引擎库。Lucene是Java语言实现的开源项目,广泛应用于信息检索、数据分析和大数据处理等领域。本指南...

    lucene 的开发包6.6

    《Apache Lucene 6.6 开发详解》 Apache Lucene 是一个开源全文搜索引擎库,由Java编写,设计为高性能、可扩展的信息检索应用程序。它提供了丰富的搜索功能,包括索引、查询、排序等,被广泛应用于各种信息管理和...

    Lucene开发包

    **Lucene 开发包详解** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发并维护。这个开发包包含了两个版本:lucene-1.4.3 和 lucene-1.4.1,分别代表了 Lucene 的不同迭代阶段,它们为开发者提供了...

Global site tag (gtag.js) - Google Analytics