- 浏览: 381182 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (215)
- ubuntu (27)
- 虚拟机 (13)
- 数据库 (29)
- JAVA (40)
- 搜索 (23)
- 开发工具 (2)
- 产品 (2)
- 工具 (1)
- 应用服务器 (5)
- linux (17)
- log (1)
- 多线程 (3)
- 异常 (1)
- shell (6)
- 12306 ;互联网 (1)
- 持续集成&Hudson (4)
- js (1)
- JAVA OR-Map (1)
- 漏洞 (1)
- svn (1)
- MAVEN (3)
- 架构 (1)
- windows (1)
- json (1)
- web (3)
- jenkins (2)
- iptables (2)
- JAVA ssh (0)
- 项目管理 (1)
- tomcat (1)
- 安全 (1)
- 数据库 mysql (1)
- 性能 (1)
最新评论
-
sbwfgihc:
怎么用的啊,
<转>mysql 树查询语句 -
panghaoyu:
实现一个智能提示功能需要ajax、数据库、jsp/php、算法 ...
<转>Solr Suggest实现搜索智能提示 -
songsove:
请问您qq多少
solr 对拼音搜索和拼音首字母搜索的支持 -
panghaoyu:
实现一个智能提示功能需要ajax、数据库、jsp/php、算法 ...
<转>Solr Suggest实现搜索智能提示 -
norain1988:
这样就可以实现相关搜索了吗
solr 百度相关搜索类似功能的实现
org.apache.lucene.demo.IndexFiles类中,使用递归的方式去索引文件。在构造了一个IndexWriter索引器之后,就可以向索引器中添加Doucument了,执行真正地建立索引的过程。遍历每个目录,因为每个目录中可能还存在目录,进行深度遍历,采用递归技术找到处于叶节点处的文件(普通的具有扩展名的文件,比如my.txt文件),然后调用如下代码中红色部分:
static void indexDocs(IndexWriter writer, File file)
throws IOException {
// file可以读取
if (file.canRead()) {
if (file.isDirectory()) { // 如果file是一个目录(该目录下面可能有文件、目录文件、空文件三种情况)
String[] files = file.list(); // 获取file目录下的所有文件(包括目录文件)File对象,放到数组files里
// 如果files!=null
if (files != null) {
for (int i = 0; i < files.length; i++) { // 对files数组里面的File对象递归索引,通过广度遍历
indexDocs(writer, new File(file, files[i]));
}
}
} else { // 到达叶节点时,说明是一个File,而不是目录,则建立索引
System.out.println("adding " + file);
try {
writer.addDocument(FileDocument.Document(file));
}
catch (FileNotFoundException fnfe) {
;
}
}
}
}
上面红色标注的这一句:
writer.addDocument(FileDocument.Document(file));
其实做了很多工作。每当递归到叶子节点,获得一个文件,而非目录文件,比如文件myWorld.txt。然后对这个文件进行了复杂的操作:
先根据由myWorld.txt构造的File对象f,通过f获取myWorld.txt的具体信息,比如存储路径、修改时间等等,构造多个Field对象,再由这些不同Field的聚合,构建出一个Document对象,最后把Document对象加入索引器IndexWriter对象中,通过索引器可以对这些聚合的Document的Field中信息进行分词、过滤处理,方便检索。
org.apache.lucene.demo.FileDocument类的源代码如下所示:
package org.apache.lucene.demo;
import java.io.File;
import java.io.FileReader;
import org.apache.lucene.document.DateTools;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
public class FileDocument {
public static Document Document(File f)
throws java.io.FileNotFoundException {
// 实例化一个Document
Document doc = new Document();
// 根据传进来的File f,构造多个Field对象,然后把他们都添加到Document中
// 通过f的所在路径构造一个Field对象,并设定该Field对象的一些属性:
// “path”是构造的Field的名字,通过该名字可以找到该Field
// Field.Store.YES表示存储该Field;Field.Index.UN_TOKENIZED表示不对该Field进行分词,但是对其进行索引,以便检索
doc.add(new Field("path", f.getPath(), Field.Store.YES, Field.Index.UN_TOKENIZED));
// 构造一个具有最近修改修改时间信息的Field
doc.add(new Field("modified",
DateTools.timeToString(f.lastModified(), DateTools.Resolution.MINUTE),
Field.Store.YES, Field.Index.UN_TOKENIZED));
// 构造一个Field,这个Field可以从一个文件流中读取,必须保证由f所构造的文件流是打开的
doc.add(new Field("contents", new FileReader(f)));
return doc;
}
private FileDocument() {}
}
通过上面的代码,可以看出Field是何其的重要,必须把Field完全掌握了。
Field类定义了两个很有用的内部静态类:Store和Index,用它们来设置对Field进行索引时的一些属性。
// Store是一个内部类,它是static的,主要为了设置Field的存储属性
public static final class Store extends Parameter implements Serializable {
private Store(String name) {
super(name);
}
// 在索引中压缩存储Field的值
public static final Store COMPRESS = new Store("COMPRESS");
// 在索引中存储Field的值
public static final Store YES = new Store("YES");
// 在索引中不存储Field的值
public static final Store NO = new Store("NO");
}
//通过Index设置索引方式
public static final class Index extends Parameter implements Serializable {
private Index(String name) {
super(name);
}
// 不对Field进行索引,所以这个Field就不能被检索到(一般来说,建立索引而使它不被检索,这是没有意义的)
// 如果对该Field还设置了Field.Store为Field.Store.YES或Field.Store.COMPRESS,则可以检索
public static final Index NO = new Index("NO");
// 对Field进行索引,同时还要对其进行分词(由Analyzer来管理如何分词)
public static final Index TOKENIZED = new Index("TOKENIZED");
// 对Field进行索引,但不对其进行分词
public static final Index UN_TOKENIZED = new Index("UN_TOKENIZED");
// 对Field进行索引,但是不使用Analyzer
public static final Index NO_NORMS = new Index("NO_NORMS");
}
Field类中还有一个内部类,它的声明如下:
public static final class TermVector extends Parameter implements Serializable
这是一个与词条有关的类。因为在检索的时候需要指定检索关键字,通过为一个Field添加一个TermVector,就可以在检索中把该Field检索到。它的构造函数:
private TermVector(String name) {
super(name);
}
通过指定一个字符串,来构造一个Field的TermVector,指定该Field的对词条的设置方式,如下:
// 不存储
public static final TermVector NO = new TermVector("NO");
// 为每个Document都存储一个TermVector
public static final TermVector YES = new TermVector("YES");
// 存储,同时存储位置信息
public static final TermVector WITH_POSITIONS = new TermVector("WITH_POSITIONS");
// 存储,同时存储偏移量信息
public static final TermVector WITH_OFFSETS = new TermVector("WITH_OFFSETS");
// 存储,同时存储位置、偏移量信息
public static final TermVector WITH_POSITIONS_OFFSETS = new TermVector("WITH_POSITIONS_OFFSETS");
}
同时,Field的值可以构造成很多类型,Field类中定义了4种:String、Reader、byte[]、TokenStream。
然后就是Field对象的构造,应该看它的构造方法,它有7种构造方法:
public Field(String name, byte[] value, Store store)
public Field(String name, Reader reader)
public Field(String name, Reader reader, TermVector termVector)
public Field(String name, String value, Store store, Index index)
public Field(String name, String value, Store store, Index index, TermVector termVector)
public Field(String name, TokenStream tokenStream)
public Field(String name, TokenStream tokenStream, TermVector termVector)
还要注意了,通过Field类的声明:
public final class Field extends AbstractField implements Fieldable, Serializable
可以看出,应该对它继承的父类AbstractField类有一个了解,下面的是AbstractField类的属性:
protected String name = "body";
protected boolean storeTermVector = false;
protected boolean storeOffsetWithTermVector = false;
protected boolean storePositionWithTermVector = false;
protected boolean omitNorms = false;
protected boolean isStored = false;
protected boolean isIndexed = true;
protected boolean isTokenized = true;
protected boolean isBinary = false;
protected boolean isCompressed = false;
protected boolean lazy = false;
protected float boost = 1.0f;
protected Object fieldsData = null;
还有Field实现了Fieldable接口,添加了一些对对应的Document中的Field进行管理判断的方法信息。
发表评论
-
百度GOOGLE的用户鼠标行为分析<转>
2012-08-29 09:37 1488转自:http://www.20ju.com/conte ... -
lucene 一些性能调优建议
2012-08-22 16:12 5539lucene 排序 Lucene默认按照相关度 ... -
<转>庖丁解牛分词之自定义词库[自定义词典]
2012-07-03 10:21 898原链接: http://hi.baidu.com/stone_ ... -
庖丁(Paoding)分词的词典原理解析
2012-07-03 10:14 3636Paoding分词过程中词典 ... -
solr 百度相关搜索类似功能的实现
2012-06-27 16:26 5738这个功能的实现有几种不同的思路。 大概半个月前,我在网 ... -
solr 索引库同步数据库
2012-06-27 14:01 5626对于拼音和拼音首字母的支持,当你在搜商品的时候,如果想输 ... -
solr 对拼音搜索和拼音首字母搜索的支持
2012-06-27 13:52 9055对于拼音和拼音首字母的支持,当你在搜商品的时候,如果想输 ... -
<转>Solr Suggest实现搜索智能提示
2012-06-27 10:15 13845智能提示简介 搜索的智能提示目前是各大搜索的标配应用, ... -
IK的整个分词处理过程
2012-06-26 14:25 11560IK的整个分词处理过 ... -
Solr的检索运算符
2012-06-21 14:47 4219“:” 指定字段查指定值,如返回所有值*:*² “?” 表示 ... -
Solr 学习(5) —- Solr查询语法和参数
2012-06-21 14:25 11222、查询语法 solr的一些查询语法 ... -
Apache Solr schema.xml及solrconfig.xml文件中文注解
2012-06-21 10:55 1164一、字段配置(schema)schema.xml位于so ... -
<转>LUCENE3.0 自学吧 4 TermDocs
2012-06-07 22:13 1212利用TermDocs也是可以得到一些有用的结果。。。代码 ... -
<转>Lucene里经常被聊到的几个话题
2012-06-07 21:54 1241lvpei.cnblogs.com.自己总结的Lucen ... -
<转>浅谈文档索引普遍原理<笔记>
2012-06-07 21:49 1003--lvpei.cnblogs.com 搜索引擎普遍采 ... -
Lucene架构简单分析
2012-06-06 15:30 1638Lucene简介Lucene 是一个基 ... -
<转>lucene3.0中Field.Index, Field.Store,Field.TermVector详解
2012-06-06 14:49 894lucene在doc.add(new Field(&quo ... -
<转>用于Lucene的各中文分词比较
2012-06-05 09:58 5559对几种中文分析器,从分词准确性和效率两方面进行比较。分析器依次 ... -
Lucene3参考资料
2012-06-05 09:46 970http://wenku.baidu.com/view/706 ... -
lucene索引word/pdf/html/txt文件及检索(搜索引擎)
2012-06-04 14:59 962因为lucene索引的时候是 ...
相关推荐
lucene.NET 中文分词 高亮 lucene.NET 中文分词 高亮 lucene.NET 中文分词 高亮 lucene.NET 中文分词 高亮
为了对文档进行索引,Lucene 提供了五个基础的类 public class IndexWriter org.apache.lucene.index.IndexWriter public abstract class Directory org.apache.lucene.store.Directory public abstract class ...
来自“猎图网 www.richmap.cn”基于IKAnalyzer分词算法的准商业化Lucene中文分词器。 1. 正向全切分算法,42万汉字字符/每秒的处理能力(IBM ThinkPad 酷睿I 1.6G 1G内存 WinXP) 2. 对数量词、地名、路名的...
描述了Lucene中如何使用FST算法构建term的内存索引,使用了很多图,直观的展现了FST图的构建流程,能够对想了解lucene内部实现机制原理的同学有帮助。
此博文是对近期做lucene索引的总结, (lucene,solr,netty,hadoop),如蒙加入,不胜感激,大家共同探讨,本人争取每日一博,希望大家关注呦
lucene 3.0 API中文帮助,学习的人懂得的
Lucene中文分词器组件,不错的。
lucene4.3增删改查的的一个工具类,对新手来说是一份不可多得的入门资料。
lucene实例lucene实例lucene实例lucene实例lucene实例lucene实例lucene实例lucene实例lucene实例
赠送jar包:lucene-core-7.2.1.jar; 赠送原API文档:lucene-core-7.2.1-javadoc.jar; 赠送源代码:lucene-core-7.2.1-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
Lucene 与中文分词的结合
Lucene,作为一种全文搜索的辅助工具,为我们进行条件搜索,无论是像Google,Baidu之类的搜索引 擎,还是论坛中的搜索功能,还是其它C/S架构的搜索,都带来了极大的便利和比较高的效率。本文主要是利用Lucene对MS Sql...
将源中需要的信息加入Document的各个Field中,并把需要索引的Field索引起来,把需要存储的Field存储起来。 将索引写入存储器,存储器可以是内存或磁盘。 2.2读出流程 用户提供搜索关键词,经过analyzer处理。 对...
NULL 博文链接:https://heisetoufa.iteye.com/blog/1932237
import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.queryParser.MultiFieldQueryParser; import org.apache....
供lucene初学者学习的几个类 包括建索引、查询等关键操作
lucene3.0 lucene3.0 lucene3.0 lucene3.0 lucene3.0
lucene中文下载 学搜索引擎的来 lucene中文下载 学搜索引擎的来 lucene中文下载 学搜索引擎的来
lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习...