本人觉得学习,lucene 要明白数据库查询的原理就Ok了
1 源文件,要搜索的文件!类似数据库!
2 创建index 索引 ,也是非常类似数据库索引的
3 document 文件对象
4 search 搜索 累世 findDateSet
上面明白!
本文档参考 QQ:962589149 本人已经提供rar 实例给大家下载!欢迎交流!
1 概述
Lucene是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。Lucene以其方便使用、快速实施以及灵活性受到广泛的关注。它可以方便地嵌入到各种应用中实现针对应用的全文索引、检索功能,本总结使用lucene-- version lucene-3.6.0 version
2. lucene 的包结构
1、org.apache.lucene.analysis对需要建立索引的文本进行分词、过滤等操作, 语言分析器,主要用于的切词Analyzer是一个抽象类,管理对文本内容的切分词规则。
2、org.apache.lucene.analysis.standard是标准分析器
3、org.apache.lucene.document提供对Document和Field的各种操作的支持。索引存储时的文档结构管理,类似于关系型数据库的表结构。
Document相对于关系型数据库的记录对象,Field主要负责字段的管理。
4、org.apache.lucene.index是最重要的包,用于向Lucene提供建立索引时各种操作的支持。索引管理,包括索引建立、删除等。索引包是整个系统核心,全文检索的根本就是为每个切出来的词建索引,查询时就只需要遍历索引,而不需要去正文中遍历,从而极大的提高检索效率。
5、org.apache.lucene.queryParser提供检索时的分析支持。查询分析器,实现查询关键词间的运算,如与、或、非等。
6、org.apache.lucene.search 负责检索。检索管理,根据查询条件,检索得到结果。
7、org.apache.lucene.store提供对索引存储的支持。数据存储管理,主要包括一些底层的I/0操作。
8、org.apache.lucene.util提供一些常用工具类和常量类的支持
3. 索引文件格式
1 .fnm格式 包含了Document中所有field名称
2 .fdt与.fdx格式 .fdt文件用于存储具有Store.YES属性的Field的数据;.fdx是一个索引,用于存储Document在.fdt中的位置。
3 .tis 与.tii格式 .tis文件用于存储分词后的词条(Term),而.tii就是它的索引文件,它表明了每个.tis文件中的词条的位置。
4 deletable格式 文档被删除后,会首先在deletable文件中留下一个记录,要真正删除时,才将索引除去。
5 复合索引格式 .cfs
使用IndexWriter的useCompoundFile() 默认为True
4 lucene中主要的类
1 IndexWriter类
1 public IndexWriter(String path,Analyzer a,Boolean create)
2 public IndexWriter(File path,Analyzer a,Boolean create)
3 public IndexWriter(Directory d,Analyzer a,Boolean create)
第一个参数:索引存放在什么地方
第二个参数:分析器,继承自org.apache.lucene.analysis.Analyzer类
第三个参数:为true时,IndexWriter不管目录内是否已经有索引了,一律清空,重新建立;当为false时,则IndexWriter会在原有基础上增量添加索引。所以在更新的过程中,需要设置该值为false。
2 Document文档类
方法 描述
void add(Field field) 往Document对象中添加字段
void removeField(String name) 删除字段。若多个字段以同一个字段名存在,则删除首先添加的字段;若不存在,则Document保持不变
void removeFields(String name) 删除所有字段。若字段不存在,则Document保持不变
Field getField(String name) 若多个字段以同一个字段名存在,则返回首先添加的字段;若字段不存在,则Document保持不变
Enumeration fields() 返回Document对象的所有字段,以枚举类型返回
Field [] getFields(String name) 根据名称得到一个Field的数组
String [] getValues(String name) 根据名称得到一个Field的值的数组
3 Field字段类
1 public Field(String name,String value,Store store,Index index);//直接的字符串方式
2 public Field(String name,String value,Store store,Index index,TermVector termVector);
3 public Field(String name,String value,Reader reader);//使用Reader从外部传入
4 public Field(String name,String value,Reader reader,TermVector termVector);
5 public Field(String name,byte[] value,Store store)//使用直接的二进制byte传
4 Store类
静态属性 描述
Store.NO 表示该Field不需要存储
Store.YES 表示该Field需要存储
Store.COMPRESS 表示用压缩方式来保存这个Field的值
5 Index类
Index.NO 不需要索引
Index.TOKENIZED 先被分词再被索引
Index.UN_TOKENIZED 不对该Field进行分词,但会对它进行索引
Index.NO_NORMS 对该Field进行索引,但是不使用Analyzer,同时禁止它参加评分,主要是为了减少内存的消耗。
6 Directory类
1 FSDirectory.getDirectory(path, true)第二个参数表示删除掉目录内原有内容
IndexWriter writer = new IndexWriter(FSDirectory.getDirectory(path, true), new StandardAnalyzer(), true);//删除原有索引
或
FSDirectory fsDir=FSDirectory.getDirectory(path,true);
IndexWriter writer = new IndexWriter(fsDir, new StandardAnalyzer(), true);
2 RAMDirectory在内存中存放,读取速度快,但程序一运行结束,它的内容就不存在了
RAMDirectory ramDir=new RAMDirectory();
IndexWriter writer = new IndexWriter(ramDir, new StandardAnalyzer(), true);
或
IndexWriter writer = new IndexWriter(new RAMDirectory(), new StandardAnalyzer(), true);
7 IndexModifier类 集成了IndexWriter的大部分功能和IndexReader中对索引删除的功能
8 IndexSearcher类
基本案例(查询)
IndexSearcher searcher = new IndexSearcher(path);
Hits hits = null;
Query query = null;
QueryParser parser =new QueryParser("contents", new StandardAnalyzer());
query =parser.parse("11");
hits = searcher.search(query);
System.out.println("查找 word1 共" + hits.length() + "个结果");
for(int i=0;i<hits.length()&&i<10;i++)
{
Document d=hits.doc(i);
System.out.println(d+" "+i+" "+hits.score(i)+" "+d.get("contents"));
}
searcher.close();
10 各种Query
1.1. 概述
query.toString()查看原子查询
1.2. 使用特定的分析器搜索
IndexSearcher searcher = new IndexSearcher(path );
Hits hits = null;
Query query = null;
QueryParser parser =new QueryParser("contents", new StandardAnalyzer());
query =parser.parse("11 a and hello");
hits=searcher.search(query); //查找 name:11 name:hello 共1个结果
System.out.println("查找 "+query.toString()+" 共" + hits.length() + "个结果");
1.3. 按词条搜索—TermQuery
Query query = null;
query=new TermQuery(new Term("name","word1 a and"));
hits=searcher.search(query);// 查找 name:word1 a and 共0个结果
System.out.println("查找 "+query.toString()+" 共" + hits.length() + "个结果");
1.4. 按“与或”搜索—BooleanQuery
1.和: MUST与MUST_NOT
2.或: SHOULD与SHOULD
3.A与B的并集-B MUST与MUST_NOT
Query query1=null;
Query query2=null;
BooleanQuery query=null;
query1=new TermQuery(new Term("name","word1"));
query2=new TermQuery(new Term("name","word2"));
query=new BooleanQuery();
query.add(query1,BooleanClause.Occur.MUST);
query.add(query2,BooleanClause.Occur.MUST_NOT);
1.5. 在某一范围内搜索—RangeQuery
Term beginTime=new Term("time","200001");
Term endTime=new Term("time","200005");
RangeQuery query=null;
query=new RangeQuery(beginTime,endTime,false);//不包含边界值
1.6. 使用前缀搜索—PrefixQuery
Term pre1=new Term("name","wor");
PrefixQuery query=null;
query = new PrefixQuery(pre1);
1.7. 短语搜索—PhraseQuery
a)默认坡度为0
PhraseQuery query = new PhraseQuery();
query.add(new Term(“bookname”,”钢”));
query.add(new Term(“bookname”,”铁”));
Hits hits=searcher.search(query); //搜索“钢铁”短语,而非“钢”和“铁”
b)设置坡度,默认为0
PhraseQuery query = new PhraseQuery();
query.add(new Term(“bookname”,”钢”));
query.add(new Term(“bookname”,”铁”));
query.setSlop(1);
Hits hits=searcher.search(query);//搜索“钢铁”或“钢*铁”中含一字
1.8. 多短语搜索—MultiPhraseQuery
a)
MultiPhraseQuery query=new MultiPhraseQuery();
//首先向其中加入要查找的短语的前缀
query.add(new Term(“bookname”,”钢”));
//构建3个Term,作为短语的后缀
Term t1=new Term(“bookname”,”铁”);
Term t2=new Term(“bookname”,”和”);
Term t3=new Term(“bookname”,”要”);
//再向query中加入所有的后缀,与前缀一起,它们将组成3个短语
query.add(new Term[]{t1,t2,t3});
Hits hits=searcher.search(query);
for(int i=0;i<hits.length();i++)
System.out.println(hits.doc(i));
b)
MultiPhraseQuery query=new MultiPhraseQuery();
Term t1=new Term(“bookname”,”钢”);
Term t2 = new Term(“bookname”,”和”);
query.add(new Term[]{t1,t2});
query.add(new Term(“bookname”,”铁”));
c)
MultiPhraseQuery query=new MultiPhraseQuery();
Term t1=new Term(“bookname”,”钢”);
Term t2 = new Term(“bookname”,”和”);
query.add(new Term[]{t1,t2});
query.add(new Term(“bookname”,”铁”));
Term t3=new Term(“bookname”,”是”);
Term t4=new Term(“bookname”,”战”);
query.add(new Term[]{t3,t4});
1.9. 模糊搜索—FuzzyQuery
使用的算法为levenshtein算法,在比较两个字符串时,将动作分为3种:
l 加一个字母
l 删一个字母
l 改变一个字母
FuzzyQuery query=new FuzzyQuery(new Term(“content”,”work”));
public FuzzyQuery(Term term)
public FuzzyQuery(Term term,float minimumSimilarity)throws IllegalArgumentException
public FuzzyQuery(Term term,float minimumSimilarity,int prefixLength)throws IllegalArgumentException
其中minimumSimilarity为最小相似度,越小则文档的数量越多。默认为0.5.其值必须<1.0
FuzzyQuery query=new FuzzyQuery(new Term(“content”,”work”),0.1f);
其中prefixLength表示要有多少个前缀字母必须完全匹配
FuzzyQuery query=new FuzzyQuery(new Term(“content”,”work”),0.1f,1);
1.10. 通配符搜索—WildcardQuery
* 表示0到多个字符
? 表示一个单一的字符
WildcardQuery query=new WildcardQuery(new Term(“content”,”?qq*”));
1.11. 跨度搜索
1.11.1. SpanTermQuery
效果和TermQuery相同
SpanTermQuery query=new SpanTermQuery(new Term(“content”,”abc”));
1.11.2. SpanFirstQuery
从Field内容的起始位置开始,在一个固定的宽度内查找所指定的词条
SpanFirstQuery query=new SpanFirstQuery(new Term(“content”,”abc”),3);//是第3个word,不是byte
1.11.3. SpanNearQuery
SpanNearQuery相当与PhaseQuery
SpanTermQuery people=new SpanTermQuery(new Term(“content”,”mary”));
SpanTermQuery how=new SpanTermQuery(new Term(“content”,”poor”));
SpanNearQuery query=new SpanNearQuery(new SpanQuery[]{people,how},3,false);
1.11.4. SpanOrQuery
把所有SpanQuery的结果合起来
SpanTermQuery s1=new SpanTermQuery(new Term(“content”,”aa”);
SpanTermQuery s2=new SpanTermQuery(new Term(“content”,”cc”);
SpanTermQuery s3=new SpanTermQuery(new Term(“content”,”gg”);
SpanTermQuery s4=new SpanTermQuery(new Term(“content”,”kk”);
SpanNearQuery query1=new SpanNearQuery(new SpanQuery[]{s1,s2},1,false);
SpanNearQuery query2=new SpanNearQuery(new SpanQuery[]{s3,s4},3,false);
SpanOrQuery query=new SpanOrQuery(new SpanQuery[]{query1,query2});
1.11.5. SpanNotQuery
从第1个SpanQuery的查询结果中,去掉第2个SpanQuery的查询结果
SpanTermQuery s1=new SpanTermQuery(new Term(“content”,”aa”);
SpanFirstQuery query1=new SpanFirstQuery(s1,3);
SpanTermQuery s3=new SpanTermQuery(new Term(“content”,”gg”);
SpanTermQuery s4=new SpanTermQuery(new Term(“content”,”kk”);
SpanNearQuery query2=new SpanNearQuery(new SpanQuery[]{s3,s4},4,false);
SpanNotQuery query=new SpanNotQuery(query1,query2);
1.12. RegexQuery—正则表达式的查询
String regex="http://[a-z]{1,3}//.abc//.com/.*";
RegexQuery query=new RegexQuery(new Term("url",regex));
分享到:
相关推荐
全文检索(Lucene)Lucene的PDF
全文检索介绍 索引 分词 Lucene介绍 Lucene应用详解 索引器 检索器 条件查询 实用工具及高亮器 Lucene综合应用——仿搜索引擎
Lucene 实时搜索,视频详解,带课程文档,Lucene 实时搜索
lucene搜索引擎配置,从载入文件,建立索引,搜索三步让你知道lucene搜索的核心技术
Lucene,作为一种全文搜索的辅助工具,为我们进行条件搜索,无论是像Google,Baidu之类的搜索引 擎,还是论坛中的搜索功能,还是其它C/S架构的搜索,都带来了极大的便利和比较高的效率。本文主要是利用Lucene对MS Sql...
详细分析lucene搜索的实现过程,通过代码解析,会对lucene的搜索实现过程有一个更加深刻的认识
Lucene分词与查询详解。这是一个完整的实例,希望对大家的开发学习有帮助!!!
Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎
2. 全文检索的实现:Luene全文索引和数据库索引的比较 3. 中文切分词机制简介:基于词库和自动切分词算法的比较 4. 具体的安装和使用简介:系统结构介绍和演示 5. Hacking Lucene:简化的查询分析器,删除的实现...
lucene.net 完全入门教程,包括 lucene.net 介绍, lucene.net工作模式, lucene.net分词方法和中文分词方法, lucene.net索引的建立详解, lucene.net搜索详解, lucene.net的下载方法, lucene.net搜索结果实现...
搜索引擎功能设计主要包括,信息资源的集成,查询扩展模块,Lucene检索模块,结果可视化。 信息资源的集成主要使用网络爬虫技术,利用java语言的regex包和selenium插件实现模拟登录以获取新浪微博,豆瓣电影,百度...
Lucene入门文档,包含索引的创建、查询、更新以及删除demo,各个常用类的详解
搜索引擎一般由搜索器、索引器、检索器和用户接口四个部分组成: 搜索器 其功能是在互联网中漫游,发现和搜集信息; 索引器 其功能是理解搜索器所搜索到的信息,从中抽取出索引项,用于表示文档以及生成文档库...
里面有4个文件,详细说明了全文检索的初步使用过程 第一个:Lucene(讲义).doc 第二个:lucene_初级学习资料.ppt 第三个:lucene_入门整理.pdf 第四个:Lucene教程详解.doc 绝对超值,新手必备宝典。超值分享。
要么是信息检索理论方面的专著,理论性太强不易懂,而且真正讲搜索引擎技术的章节并不 太多;要么是Lucene 代码分析这种过于实务的书籍,像搜索引擎这种充满算法的应用,直 接分析开源系统代码并不是非常高效的学习...
搜索引擎功能设计主要包括,信息资源的集成,查询扩展模块,Lucene检索模块,结果可视化。信息资源的集成主要使用网络爬虫技术,利用java语言的regex包和selenium插件实现模拟登录以获取新浪微博,豆瓣电影,百度...
SearchEngineDemo 学习搜索引擎的一些demo CustomizeTokenStreamByLucene 基于Lucene实现...luceneSearchDetail Lucene搜索详解(Lucene搜索流程详解、搜索核心API详解、基本查询详解、QueryParser详解)博客学习地址:
关于搜索引擎的一本好书,强烈推荐,都是做搜索引擎的核心技术
ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。支持通过HTTP使用JSON进行数据索引。 我们建立一个网站或应用程序,...