- 浏览: 480996 次
- 性别:
- 来自: 湖南
文章分类
- 全部博客 (201)
- j2ee (43)
- oracle (9)
- mysql (7)
- db2 (1)
- j2se (3)
- spring (1)
- hibernate (3)
- struts (0)
- Berkeley DB (0)
- linux (60)
- Apache2+PHP+MYSQL (2)
- solr (15)
- svn (1)
- IntelliJ Idea (1)
- eclipse,myeclipse (4)
- ant (2)
- vim (8)
- IT生活 (4)
- 测试 (6)
- lucene (4)
- shell (1)
- nutch (18)
- thread (1)
- hadoop (5)
- mapreduce (0)
- Python (4)
- 硬件 (1)
- database (1)
- maven (1)
- 正则表达 (0)
- 互联网 (1)
最新评论
-
youngcoder:
good job
HTTP协议头部与Keep-Alive模式详解 -
javazdq:
受教了 解释的不错。
lucene创建索引高级特性和索引创建参数优化 -
josico:
有几个问题想问下楼主1. LinkedBlockingQueu ...
生产者-消费者-BlockingQueue -
annybz:
有没有关于 BlockingQueue和ConcurrentL ...
生产者-消费者-BlockingQueue -
uniquejava:
多谢,记录的很真实。
DB2 学习记录
由于solr1.4使用Lucene 2.9.1 ,故需要修改庖丁源代码:net.paoding.analysis.analyzer.PaodingTokenizer
需要注意的有两点
1. 继承关系由 TokenStream 调整为 Tokenizer,因此需要删除变量
private final Reader input;
删除对应的关闭方法
public void close() throws IOException {
super.close();
input.close();
}
2. 高亮显示功能由于底层实现变化,故需要重写reset方法。原先reset 只是调整input。现在需要将多个值重置。
public void reset(Reader input) throws IOException {
this.input = input;
this.inputLength=0;
this.offset=0;
this.dissected=0;
this.tokenIteractor=null;
this.beef.set(0, 0);
}
调整后的整体代码如下
package net.paoding.analysis.analyzer;
/**
* Copyright 2007 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.io.IOException;
import java.io.Reader;
import java.util.Iterator;
import net.paoding.analysis.analyzer.impl.MostWordsTokenCollector;
import net.paoding.analysis.knife.Beef;
import net.paoding.analysis.knife.Collector;
import net.paoding.analysis.knife.Knife;
import net.paoding.analysis.knife.Paoding;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.Tokenizer;
/**
* PaodingTokenizer是基于“庖丁解牛”框架的TokenStream实现,为PaodingAnalyzer使用。
* <p>
*
* @author Zhiliang Wang [qieqie.wang@gmail.com]
* @see Beef
* @see Knife
* @see Paoding
* @see Tokenizer
* @see PaodingAnalyzer
*
* @see Collector
* @see TokenCollector
* @see MAxTokenCollector
* @see MostWordsTokenCollector
*
* @since 1.0
*/
public final class PaodingTokenizer extends Tokenizer implements Collector {
// -------------------------------------------------
/**
* 从input读入的总字符数
*/
private int inputLength;
/**
*
*/
private static final int bufferLength = 128;
/**
* 接收来自{@link #input}的文本字符
*
* @see #next()
*/
private final char[] buffer = new char[bufferLength];
/**
* {@link buffer}[0]在{@link #input}中的偏移
*
* @see #collect(String, int, int)
* @see #next()
*/
private int offset;
/**
*
*/
private final Beef beef = new Beef(buffer, 0, 0);
/**
*
*/
private int dissected;
/**
* 用于分解beef中的文本字符,由PaodingAnalyzer提供
*
* @see #next()
*/
private Knife knife;
/**
*
*/
private TokenCollector tokenCollector;
/**
* tokens迭代器,用于next()方法顺序读取tokens中的Token对象
*
* @see #tokens
* @see #next()
*/
private Iterator/* <Token> */ tokenIteractor;
// -------------------------------------------------
/**
*
* @param input
* @param knife
* @param tokenCollector
*/
public PaodingTokenizer(Reader input, Knife knife, TokenCollector tokenCollector) {
this.input = input;
this.knife = knife;
this.tokenCollector = tokenCollector;
}
// -------------------------------------------------
public TokenCollector getTokenCollector() {
return tokenCollector;
}
public void setTokenCollector(TokenCollector tokenCollector) {
this.tokenCollector = tokenCollector;
}
// -------------------------------------------------
public void collect(String word, int offset, int end) {
tokenCollector.collect(word, this.offset + offset, this.offset + end);
}
// -------------------------------------------------
public Token next() throws IOException {
// 已经穷尽tokensIteractor的Token对象,则继续请求reader流入数据
while (tokenIteractor == null || !tokenIteractor.hasNext()) {
//System.out.println(dissected);
int read = 0;
int remainning = -1;//重新从reader读入字符前,buffer中还剩下的字符数,负数表示当前暂不需要从reader中读入字符
if (dissected >= beef.length()) {
remainning = 0;
}
else if (dissected < 0){
remainning = bufferLength + dissected;
}
if (remainning >= 0) {
if (remainning > 0) {
System.arraycopy(buffer, -dissected, buffer, 0, remainning);
}
read = this.input.read(buffer, remainning, bufferLength - remainning);
inputLength += read;
int charCount = remainning + read;
if (charCount < 0) {
// reader已尽,按接口next()要求返回null.
return null;
}
if (charCount < bufferLength) {
buffer[charCount ++] = 0;
}
// 构造“牛”,并使用knife“解”之
beef.set(0, charCount);
offset += Math.abs(dissected);
//offset -= remainning;
dissected = 0;
}
dissected = knife.dissect((Collector)this, beef, dissected);
// offset += read;// !!!
tokenIteractor = tokenCollector.iterator();
}
// 返回tokensIteractor下一个Token对象
return (Token) tokenIteractor.next();
}
public int getInputLength() {
return inputLength;
}
//重新实现reset(input),切记需要抛出异常。
public void reset(Reader input) throws IOException {
this.input = input;
this.inputLength=0;
this.offset=0;
this.dissected=0;
this.tokenIteractor=null;
this.beef.set(0, 0);
}
}
另外,关于原先实现的中文切词中的create方法,需要修改返回的类型。代码如下
package net.paoding;
import java.io.Reader;
import java.util.Map;
import net.paoding.analysis.analyzer.PaodingTokenizer;
import net.paoding.analysis.analyzer.TokenCollector;
import net.paoding.analysis.analyzer.impl.MaxWordLengthTokenCollector;
import net.paoding.analysis.analyzer.impl.MostWordsTokenCollector;
import net.paoding.analysis.knife.PaodingMaker;
import org.apache.lucene.analysis.Tokenizer;
import org.apache.solr.analysis.BaseTokenizerFactory;
/**
* Solr 1.4 paoding tokenizer factory
*
*/
public class ChineseTokenizerFactory extends BaseTokenizerFactory {
/**
* 最多分词,默认.
*/
public static final String MOST_WORDS_MODE = "most-words";
/**
* 最长分词.
*/
public static final String MAX_WORD_LENGTH_MODE = "max-word-length";
private String mode = null;
public void setMode(String mode) {
if (mode==null||MOST_WORDS_MODE.equalsIgnoreCase(mode)
|| "default".equalsIgnoreCase(mode)) {
this.mode=MOST_WORDS_MODE;
} else if (MAX_WORD_LENGTH_MODE.equalsIgnoreCase(mode)) {
this.mode=MAX_WORD_LENGTH_MODE;
} else {
throw new IllegalArgumentException("不合法的分析器Mode参数设置:" + mode);
}
}
public void init(Map<String, String> args) {
super.init(args);
setMode(args.get("mode"));
}
public Tokenizer create(Reader input) {
return new PaodingTokenizer(input, PaodingMaker.make(),createTokenCollector());
}
private TokenCollector createTokenCollector() {
if( MOST_WORDS_MODE.equals(mode)) {
return new MostWordsTokenCollector();
}
if( MAX_WORD_LENGTH_MODE.equals(mode)) {
return new MaxWordLengthTokenCollector();
}
throw new Error("never happened");
}
}
如需使用该分词器,则需要配置字段类型schema.xml 中的fieldType的tokenizer 为下面形式。具体class路径根据实际的ChineseTokenizerFactory位置填写。
<tokenizer class="net.paoding.ChineseTokenizerFactory" mode="most-words"/>
上面讲述的是solr 1.4配置庖丁的方式。如果您是从solr1.3升级,那么请务必注意下面这段文字:
如果是升级,则需要核对schema.xml 中的 field 的type 定义对应好(如果原来是 int 类型的要注意,solr 1.4 把 int 用 tint 类型了。如果要兼容,要把 int 的类型修改成 pint。其它 long,float 一样修改)具体对应关系可根据solr1.3的fieldType 中各种类型定义 与solr1.4中fieldType 各种类型定义对比。
文章出自幸福的小小仙
xian0617@qq.com 或 xian0617@163.com
发表评论
-
对Lucene PhraseQuery的slop的理解
2012-06-12 10:55 1587所谓PhraseQuery,就是通过短语来检索,比如我想查“b ... -
Solr 获取分词
2012-05-07 18:32 3579个人博客:http://demi-panda.com ... -
Apache Lucene 和 Solr 进行位置感知搜索
2012-04-26 18:26 1176个人技术博客:http://demi-panda.com ... -
Lucene Similarity (Lucene 文档评分score机制详解)
2012-04-06 16:06 1853个人博客:http://demi-panda.com ... -
Solr Replication
2012-02-21 17:41 3168个人博客:http://demi-pand ... -
Solr 同义词搜索 synonyms
2012-02-09 18:30 2610个人技术博客:http://demi-panda.com ... -
Solr合并索引方式
2011-12-09 15:41 39051, Solr 合并索引数据有 ... -
Solr Faceted
2011-11-26 17:07 1181http://www.lucidimagination.com ... -
SolrOperationsTools使用
2011-10-18 17:41 1137basic Solr scripts These sc ... -
LucidGaze for Solr 搜索监测工具
2010-11-14 22:56 1739LucidGaze for Solr 搜索监测工具 ... -
SOLR的分布式部署(复制)CollectionDistribute 快照分发 (精简版)
2010-08-20 13:34 2582SOLR复制模式,是一种在分布式环境下用于同步主 ... -
solr 分布式(复制)配置
2010-08-20 13:33 1800solr 分布式(复制)配置 s ... -
solr1.4配置IKAnalyzer3.2
2010-08-14 23:56 2190个人技术博客:http://demi-panda.com ... -
Lucene/Solr开发经验[转载]
2010-08-14 21:44 1562Lucene/Solr开发经验[转载] ...
相关推荐
### Solr 1.4 企业搜索服务器:深入解析与应用 #### 一、Solr 1.4 概览 Solr 1.4 是一个功能强大的企业级搜索引擎平台,它基于Apache Lucene(一个高性能全文检索库)构建而成。Solr 1.4 版本在2009年由Packt ...
### Window下Solr1.4安装部署的知识点详解 #### 一、Solr简介 Apache Solr 是一个高性能、基于Lucene的全文检索服务。它提供了丰富的功能集,包括高度可扩展性、易于部署和强大的搜索功能。Solr 1.4版本是在2009年...
总结来说,Solr1.4教程详细介绍了Solr的核心特性、工作原理和源码结构,旨在帮助开发者快速理解和掌握Solr的使用。通过学习本教程,读者可以具备搭建、配置和优化Solr搜索服务的能力,为企业的信息检索提供强大支持...
### Apache Solr 1.4 企业搜索服务器 #### 简介 Apache Solr 1.4 是一款高度可扩展、高性能的企业级搜索平台,它基于著名的全文搜索引擎库 Apache Lucene 构建而成。Solr 提供了丰富的功能集,如面向用户的分面导航...
《Solr 1.4企业级搜索服务器》一书详细介绍了Apache Solr 1.4版本,这是一个开源的、高性能的、全功能的企业级搜索平台。本书由David Smiley和Eric Pugh共同编写,旨在帮助读者掌握如何利用Solr增强搜索体验,包括...
《Packtpub.Solr.1.4.Enterprise.Search.Server.Aug.2009》是一本专注于Solr 1.4的企业搜索服务器构建的专著。这本书详细介绍了如何利用Solr来创建高效、可扩展的搜索解决方案,适用于各种规模的企业。Solr是Apache ...
在本文档中,我们将详细介绍如何部署和使用 Solr 5.5.4 版本,包括两种常见的部署方式:Jetty 和 Tomcat,并涉及到中文分词器IKAnalyzer的集成以及对Word文档的支持。 首先,我们需要准备合适的环境,这里要求的是...
3. **加载中文分词jar包**:将中文分词器的jar包添加到Solr的lib目录下,以供Solr使用。 #### 六、监控Solr 监控Solr集群的状态对于及时发现和解决问题至关重要。 - **使用Cloudera Manager**:Cloudera Manager...
Solr安装与使用 Solr是一款功能强大的搜索引擎,能够帮助我们快速搭建企业搜索平台。在本文中,我们将详细介绍Solr的安装和使用过程。 一、安装Solr 首先,我们需要下载Solr的安装包。这里我们使用的是Solr 1.3...
本压缩包“solr-dataimportscheduler-1.4.jar 增量定时同步数据到solr.rar”是针对Solr的一款实用工具,用于实现数据库数据的增量定时同步。这个jar包的核心功能是DataImportHandler(DIH),它是一个内置在Solr中的...
Solr,全称为Apache Solr,是一款开源的全文搜索引擎,被广泛应用于企业级搜索...通过正确地配置和使用`apache-solr-dataimportscheduler-1.4.jar`,你可以有效地管理和维护Solr索引,确保搜索结果的准确性和时效性。
solr6.1.0版本jar已经不再提供读取自动索引配置文件路径的方法,因此apache-solr-dataimportscheduler-1.0内调用该方法的所有操作都无法实现。于是需要下载apache-solr-dataimportscheduler-1.0-with-source.jar并...
IKAnalyzer 是一个广泛使用的开源中文分词器,它特别设计用于支持 Solr 和 Lucene(Solr 的底层搜索引擎库)等项目。IKAnalyzer 提供了强大的分词能力,能够处理复杂的中文语法和词汇,包括多音字、成语和新词发现。...
通过以上步骤,我们就能在Solr 5.4中成功配置并使用中文分词库。这个过程对于提升中文文档的检索效率和准确性至关重要,因为正确的分词可以极大地提高搜索结果的相关性。同时,根据实际需求,还可以对分词库进行定制...
"solr中文解析器以及使用文档"这个主题主要涵盖了Solr在处理中文内容时的关键技术和实践。 1. **中文分词**:中文文本不像英文那样以空格作为单词的分隔符,因此在索引和搜索时需要进行分词处理。IK Analyzer是一个...
### Solr在Java中的使用总结 #### 一、Solr简介 Solr是一个高性能的全文搜索引擎,基于Apache Lucene开发,使用Java 5编写。它不仅继承了Lucene的强大功能,还提供了更丰富的查询语言以及更好的性能优化。Solr具备...
总结来说,这个配置文档应该包含了如何在Tomcat上部署Solr,以及如何配置Solr以使用庖丁解牛分词器进行中文处理的详细步骤。这对于需要处理大量中文数据的搜索应用开发者来说,是一份非常实用的参考资料。通过阅读...