SlideShare a Scribd company logo
1 of 7
lucene2.4 学习笔记 1-( 初学 Lucene, 简单例子 )

关键字: indexwriter hits lucene field
说明一下,这一篇文章的用到的 lucene,是用 2.4 版本的,主要在查询的时候 2.0
版本的 lucene 与以前的版本有了一些区别
下面是一个简单的例子
1.第一步建立索引
Java 代码

  1. public class IndexDatebase {
  2.
  3.     public static void main(String[] args) throws IOException {

  4.           //创建保存索引的目录
  5.           String indexDir = "d://indexDir";
  6.           //创建 Directory 对象,具体的实现有
      FSDirectory,RAMDirectory,MMapDirectory,NIOFSDirector
  7.           //FSDirectory 表示索引是放到文件里面的,RAMDirectory 是放
      到内存里面
  8.           //new RAMDirectory()
  9.           Directory index = FSDirectory.getDirectory(new File(ind
      exDir));
  10.          //创建索引 IndexWriter 对象,要四个参数,第一个是
      Directory 对象,可以传 File 和 String 类型的 path
  11.          //new StandardAnalyzer()这个表示分析器,拆字用的,其它的
      分析器还有 new ChineseAnalyzer(),new IK_CAnalyzer(),new CJKAnal
      yzer()
  12.          //第三个参数代表是新建 Index 还是在原来上面的追加,true
      是新建
  13.          //表示分词的最大值,比如说 new MaxFieldLength(2),就表
      示两个字一分,一般用 IndexWriter.MaxFieldLength.LIMITED
  14.          IndexWriter writer = new IndexWriter(indexDir,new Stand
      ardAnalyzer(),true,IndexWriter.MaxFieldLength.LIMITED);
  15.          //IndexWriter writer = new IndexWriter(indexDir,new Sta
      ndardAnalyzer(),true,new MaxFieldLength(20));
  16.          addDoc(writer,"法医鉴定称湖北石南海首死亡厨师系自杀");

  17.        addDoc(writer,"国务院建议珠海横琴岛划南海地交澳门管理");

  18.     addDoc(writer,"印尼在南海扣 75 名中国渔民 中方要求尽快释
      放南海南海南海南海南海南海南海");
  19.     addDoc(writer,"南海南海南海南海南海南海南海南海南海印尼
      在南海扣 75 南海南海名中国渔民 中方要求尽快释放");
20.          addDoc(writer,"湖北洪湖一初南海中生被同学刺亡 亲属怒砸
      学校 ");
 21.          //优化
 22.          writer.optimize();
 23.          //关闭流
 24.          writer.close();
 25.
 26.     }
 27.     /**
 28.       * 把 Document 对象加到 Index 里面
 29.       * @param w
 30.       * @param value
 31.       * @throws IOException
 32.       */
 33.     private static void addDoc(IndexWriter w, String value) thr
     ows IOException {
 34.          //新建的 Document 对象
 35.          Document doc = new Document();
 36.          //Field(String name, String value, Store store, Index i
     ndex)表示保存,并建立索引,如果字段多的话,不要都建立索引
 37.          doc.add(new Field("title", value, Field.Store.YES,Field
     .Index.ANALYZED));
 38.          //加进去
 39.          w.addDocument(doc);
 40.     }
 41.}


2.从索引中找出相应的对象
Java 代码

 1. public class QueryLucene {
 2.
 3.       public static void main(String[] args) throws ParseExceptio
      n, CorruptIndexException, IOException {
 4.           //创建 Query,QueryParser 对象,根据 Field 建立的索引的
      KEY 来搜,并设置要搜的内容
 5.           Query query = new QueryParser("title",new StandardAnaly
      zer()).parse("南海");
 6.           //可以理解成读 Index 对象,Directory,File,String 都行
 7.           IndexSearcher indexSearch = new IndexSearcher(FSDirecto
      ry.getDirectory(new File("d://indexDir")));
 8.           //表示查出前四个
 9.           TopDocCollector collector = new TopDocCollector(4);
10.           //查找
  11.           indexSearch.search(query,collector);
  12.           //ScoreDoc 这个对象还不清楚,但是有多少结果,就有多少个
        这个对象
  13.           ScoreDoc[] hits = collector.topDocs().scoreDocs;
  14.           for(int i=0;i<hits.length;++i) {
  15.               //找到这个 Document 原来的索引值
  16.               int docId = hits[i].doc;
  17.               System.out.println(docId);
  18.               //根据这个值找到对象的 Document
  19.               Document d = indexSearch.doc(docId);
  20.               System.out.println((i + 1) + ". " + d.get("title"))
        ;
  21.           }
  22.
  23.       }
  24.
  25.}




1.x,2.0 和 2.4 是有一些区别的
比如说:
1
Java 代码

  1. //1.x
  2. IndexWriter writer = new IndexWriter(indexPath, getAnalyzer(),
     true);
  3. //2.0,2.4
  4. IndexWriter writer = new IndexWriter(indexPath, getAnalyzer(),
     true, IndexWriter.MaxFieldLength.UNLIMITED);


2.
Java 代码

  1. Field.Index.TOKENIZED 替换为 Field.Index.ANALYZED
  2. 没啥特殊的,改了一个名字而已


3.
Java 代码
1. IndexWriter.flush();
  2. 替换为
  3. IndexWriter.commit();




4.org.apache.lucene.search.Hits;
这个类将在 3.0 中被删除
新的使用方法在上面的例子中

5.Field 的创建
Java 代码

  1. 在 2.0+中
  2. Field 没了 Keyword、UnIndexed、UnStored、Text 这几个静态成员,只能用

  3. Field(String, String, Store, Index)。
  4. Keyword 对应 Field.Store.YES, Field.Index.UN_TOKENIZED,
  5. UnIndexed 对应 Field.Store.YES, Field.Index.NO,
  6. UnStored 对应 Field.Store.NO, Field.Index.TOKENIZED,
  7. Text 对应 Field.Store.YES, Field.Index.TOKENIZED
  8. //2.0 版本以上
  9. Field(String name, byte[] value, Field.Store store)
  10.          // Create a stored field with binary value.
  11.Field(String name, Reader reader)
  12.          // Create a tokenized and indexed field that is not s
      tored.
  13.Field(String name, Reader reader, Field.TermVector termVector)

  14.           // Create a tokenized and indexed field that is not s
      tored, optionally with storing term vectors.
  15.Field(String name, String value, Field.Store store, Field.Index
      index)
  16.           // Create a field by specifying its name, value and h
      ow it will be saved in the index.
  17.Field(String name, String value, Field.Store store, Field.Index
      index, Field.TermVector termVector)
  18.           // Create a field by specifying its name, value and h
      ow it will be saved in the index.




Field.Store 表示“是否存储”,即该 Field 内的信息是否要被原封不动的保
存在索引中。
Field.Index 表示“是否索引”,即在这个 Field 中的数据是否在将来检索时
需要被用户检索到,一个“不索引”的 Field 通常仅是提供辅助信息储存的功
能。

Field.TermVector 表示“是否切词”,即在这个 Field 中的数据是否需要被切
词。


通常,参数用 Reader,表示在文本流数据源中获取数据,数据量一般会比较大。
像链接地址 URL、文件系统路径信息、 时间日期、人名、  居民身份证、     电话号码等等
通常将被索引并且完整的存储在索引中,但一般不需要切分词,通常用上面的
第四个构造函数,第三四个参数分别为 Field.Store.YES, Field.Index.YES。
而长文本通常可用第 3 个构造函数。




IndexSearch 类 查询器
搜索入口,继承自 Search
1.public IndexSearcher(Directory directory)
 使用方法
String IndexPath="D:/IndexPath";
Directory directory=FSDirectory.getDirectory(IndexPath);
IndexSearcher searcher=new IndexSearcher(directory);
支持 RAM 存储的索引,提高检索速度,建议使用,因为此方法将索引存放的路径与搜索分离
2.public IndexSearcher(String path)
直接操作索引目录.不支持 RAM 存储的索引
IndexSearcher searcher=new IndexSearcher("D:/IndexPath");
3.public IndexSearcher(IndexReader r)
IndexSearcher searcher=IndexSearcher(reader);
4.private IndexSearcher(IndexReader r, boolean closeReader)
在 3 的 基 础 上 对 了 判 断 在 关 闭 IndexSearcher 时 是 否 要 关 闭 所 带 的 IndexReader 对 象 的
boolean 类型参数


多索引目录就是要在多个索引目录的中进行比较搜索,类似概念在 SQL 中就是 select *
from TableA union select * from TableB。
IndexSearcher[] searchers = new IndexSearcher[2];
searchers[0] = new IndexSearcher(IndexPath0);
searchers[1] = new IndexSearcher(IndexPath1);

IndexSearcher 类的主要方法 Search 通过重载实现多种检索方式.通过其参数控制检索.
参数解释
Weigth weigth          权重     指定索引中文档重要性参数,改变默认其值
HitCollector results   保存搜索的所有结果.
Filter filter          指定对结果进行过滤的方式
Query query            每个 Search 必须的对象参数.指定检索的方式
Sort sort              指定检索排序的方法.可自定义排序方式进行结果的排序和输出

Query 有很多的子类 指定了不同的查询方式,query 是用户输入的内容,analyzer 是用来将用
户输入的内容也作分析处理
TermQuery
Term t=new Term(”contents”,”lucene”); 构造 TermQuery 把查询条件视为一个 key, 要求和查询
内容完全匹配,比如 Field.Keyword 类型就可以使用 TermQuery

RangeQuery 区间检索
RangeQuery 表 示 一 个 范 围 的 搜 索 条 件 , 在 年 龄 , 日 期 , 工 资 等 数 字 类 的 索 引 库 中 常 用
R,angeQuery query = new RangeQuery(begin, end, included); 类似 sql 中 betwee...and..... 最后一
个 boolean 值表示是否包含边界条件本身 , 用字符表示为”[begin TO end]” 或者”{begin TO
end}”

PrefixQuery    字符串前缀检索,如"sys*"

BooleanQuery 逻辑组合检索
组合的 Query,你可以把各种 Query 添加进去并标明他们的逻辑关系,添加条件用 public void
add(Query query, boolean required, boolean prohibited) 方 法 , 后 两 个 boolean 变 量 是
标示 AND OR NOT 三种关系 字符表示为” AND OR NOT” 或 “+ -” ,一个 BooleanQuery
中可以添加多个 Query, 如果超过 setMaxClauseCount(int) 的值 ( 默认 1024 个 ) 的话 , 会抛出
TooManyClauses 错误.

PhraseQuery 短语检索
PhraseQuery 所以提供了一个 setSlop()参数,在查询中 ,lucene 会尝试调整单词的距离和位置 ,
这个参数表示可以接受调整次数限制,如果实际的内容可以在这么多步内调整为完全匹配,那
么就被视为匹配 . 在默认情况下 slop 的值是 0, 所以默认是不支持非严格匹配的 , 通过设置
slop 参数(比如”red pig”匹配”red fat pig”就需要 1 个 slop 来把 pig 后移动 1 位),我们可以让
lucene 来模糊查询. 值得注意的是,PhraseQuery 不保证前后单词的次序 ,在上面的例子中,”pig
red”需要 2 个 slop,也就是如果 slop 如果大于等于 2,那么”pig red”也会被认为是匹配的.

WildcardQuery 通配符检索
使用?和*来表示一个或多个字母比如 sys*可以匹配 system ,systop,systaltic…,
FuzzyQuery 模糊搜索
一般不处理中文,处理于英文的各种时态变化和复数形式,匹配结果的相关度是不一样的.

QueryParser 使用
QueryParser 将用户输入转为 Query 或者 Query 组, 将 Query 的字符表示(Query.toString)转化
为实际的 Query 对象,

Hit 搜索结果的处理:Hits 对象
Hits 对象是搜索结果的集合 主要有下面几个方法
1.length() , 记录有多少条结果返回
2.doc(n)     返回第 n 个记录
3.id(in)     返回第 n 个记录的 Document ID
4.score(n)    第 n 个记录的相关度(积分)




本 文 来 自                   CSDN      博 客 , 转 载 请                    标   明   出   处   :
http://blog.csdn.net/lwlsoftware/archive/2009/02/21/3916082.aspx

More Related Content

What's hot

16 hibernate criteria查询
16 hibernate criteria查询16 hibernate criteria查询
16 hibernate criteria查询Zelin Wang
 
希望科技研发部变量命名及编码规范
希望科技研发部变量命名及编码规范希望科技研发部变量命名及编码规范
希望科技研发部变量命名及编码规范Hongjian Wang
 
iOS程序设计-数据持久化
iOS程序设计-数据持久化iOS程序设计-数据持久化
iOS程序设计-数据持久化qiyutan
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換Justin Lin
 
深入学习Mongo db
深入学习Mongo db深入学习Mongo db
深入学习Mongo dbLucien Li
 
Spring框架
Spring框架Spring框架
Spring框架eastsky
 
Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答Justin Lin
 
无数据库日志文件恢复数据库方法两则
无数据库日志文件恢复数据库方法两则无数据库日志文件恢复数据库方法两则
无数据库日志文件恢复数据库方法两则wensheng wei
 
Programming python - part 1
Programming python - part 1Programming python - part 1
Programming python - part 1Che-Cheng Hsu
 
冲浪 Object-c
冲浪 Object-c冲浪 Object-c
冲浪 Object-cjeff kit
 
Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研lorisjand
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析Justin Lin
 
5. 從模組到類別
5. 從模組到類別5. 從模組到類別
5. 從模組到類別Justin Lin
 
所谓闭包
所谓闭包所谓闭包
所谓闭包youzitang
 
CH04:認識物件
CH04:認識物件CH04:認識物件
CH04:認識物件Justin Lin
 

What's hot (18)

16 hibernate criteria查询
16 hibernate criteria查询16 hibernate criteria查询
16 hibernate criteria查询
 
希望科技研发部变量命名及编码规范
希望科技研发部变量命名及编码规范希望科技研发部变量命名及编码规范
希望科技研发部变量命名及编码规范
 
Js培训
Js培训Js培训
Js培训
 
iOS程序设计-数据持久化
iOS程序设计-数据持久化iOS程序设计-数据持久化
iOS程序设计-数据持久化
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換
 
深入学习Mongo db
深入学习Mongo db深入学习Mongo db
深入学习Mongo db
 
Js tree
Js treeJs tree
Js tree
 
Spring框架
Spring框架Spring框架
Spring框架
 
Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答
 
无数据库日志文件恢复数据库方法两则
无数据库日志文件恢复数据库方法两则无数据库日志文件恢复数据库方法两则
无数据库日志文件恢复数据库方法两则
 
Programming python - part 1
Programming python - part 1Programming python - part 1
Programming python - part 1
 
冲浪 Object-c
冲浪 Object-c冲浪 Object-c
冲浪 Object-c
 
A
AA
A
 
Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析
 
5. 從模組到類別
5. 從模組到類別5. 從模組到類別
5. 從模組到類別
 
所谓闭包
所谓闭包所谓闭包
所谓闭包
 
CH04:認識物件
CH04:認識物件CH04:認識物件
CH04:認識物件
 

Viewers also liked

Consuelo garcia garcia miguel hernandez valladolid
Consuelo garcia garcia miguel hernandez valladolidConsuelo garcia garcia miguel hernandez valladolid
Consuelo garcia garcia miguel hernandez valladolidABNCFIE VALLADOLID
 
1 8 Landscape Business Taxes & Licenses
1 8 Landscape Business Taxes & Licenses1 8 Landscape Business Taxes & Licenses
1 8 Landscape Business Taxes & LicensesFauquier Horticulture
 
Biology Chapter 28 Section 2[1]
Biology  Chapter 28 Section 2[1]Biology  Chapter 28 Section 2[1]
Biology Chapter 28 Section 2[1]Tamara
 
Verona prof dev presentation singleton elad 540
Verona prof dev presentation singleton elad 540Verona prof dev presentation singleton elad 540
Verona prof dev presentation singleton elad 540Tracey Singleton
 
Conservation Photography -- Going Beyond the Pretty Picture
Conservation Photography -- Going Beyond the Pretty PictureConservation Photography -- Going Beyond the Pretty Picture
Conservation Photography -- Going Beyond the Pretty PictureRamki Sreenivasan
 
Hampstead Social Programme 22/02/16
Hampstead Social Programme 22/02/16Hampstead Social Programme 22/02/16
Hampstead Social Programme 22/02/16Kat Holloway
 
NARRATIVAS DE PROFESSORES EM INÍCIO DE CARREIRA NO ENSINO SUPERIOR DA UNIVERS...
NARRATIVAS DE PROFESSORES EM INÍCIO DE CARREIRA NO ENSINO SUPERIOR DA UNIVERS...NARRATIVAS DE PROFESSORES EM INÍCIO DE CARREIRA NO ENSINO SUPERIOR DA UNIVERS...
NARRATIVAS DE PROFESSORES EM INÍCIO DE CARREIRA NO ENSINO SUPERIOR DA UNIVERS...ProfessorPrincipiante
 
M U S I C A N D S U P E R H E A L T H D R
M U S I C  A N D  S U P E R H E A L T H  D RM U S I C  A N D  S U P E R H E A L T H  D R
M U S I C A N D S U P E R H E A L T H D Rbanothkishan
 
Assure unit plan
Assure unit planAssure unit plan
Assure unit planreavis2
 
parenscript-tutorial
parenscript-tutorialparenscript-tutorial
parenscript-tutorialtutorialsruby
 
HP brochure europa def
HP brochure europa defHP brochure europa def
HP brochure europa defAlberto Tufano
 

Viewers also liked (20)

Consuelo garcia garcia miguel hernandez valladolid
Consuelo garcia garcia miguel hernandez valladolidConsuelo garcia garcia miguel hernandez valladolid
Consuelo garcia garcia miguel hernandez valladolid
 
1 8 Landscape Business Taxes & Licenses
1 8 Landscape Business Taxes & Licenses1 8 Landscape Business Taxes & Licenses
1 8 Landscape Business Taxes & Licenses
 
Biology Chapter 28 Section 2[1]
Biology  Chapter 28 Section 2[1]Biology  Chapter 28 Section 2[1]
Biology Chapter 28 Section 2[1]
 
Verona prof dev presentation singleton elad 540
Verona prof dev presentation singleton elad 540Verona prof dev presentation singleton elad 540
Verona prof dev presentation singleton elad 540
 
The pitch
The pitchThe pitch
The pitch
 
Reporteeeeeeee finaaaaaaaallll
Reporteeeeeeee finaaaaaaaallllReporteeeeeeee finaaaaaaaallll
Reporteeeeeeee finaaaaaaaallll
 
Escrevendo o futuro
Escrevendo o futuroEscrevendo o futuro
Escrevendo o futuro
 
Conservation Photography -- Going Beyond the Pretty Picture
Conservation Photography -- Going Beyond the Pretty PictureConservation Photography -- Going Beyond the Pretty Picture
Conservation Photography -- Going Beyond the Pretty Picture
 
Fd1 Class Introduction
Fd1 Class IntroductionFd1 Class Introduction
Fd1 Class Introduction
 
Hampstead Social Programme 22/02/16
Hampstead Social Programme 22/02/16Hampstead Social Programme 22/02/16
Hampstead Social Programme 22/02/16
 
Sports
SportsSports
Sports
 
NARRATIVAS DE PROFESSORES EM INÍCIO DE CARREIRA NO ENSINO SUPERIOR DA UNIVERS...
NARRATIVAS DE PROFESSORES EM INÍCIO DE CARREIRA NO ENSINO SUPERIOR DA UNIVERS...NARRATIVAS DE PROFESSORES EM INÍCIO DE CARREIRA NO ENSINO SUPERIOR DA UNIVERS...
NARRATIVAS DE PROFESSORES EM INÍCIO DE CARREIRA NO ENSINO SUPERIOR DA UNIVERS...
 
Pre estomago de los rumiantes
Pre estomago de los rumiantesPre estomago de los rumiantes
Pre estomago de los rumiantes
 
M U S I C A N D S U P E R H E A L T H D R
M U S I C  A N D  S U P E R H E A L T H  D RM U S I C  A N D  S U P E R H E A L T H  D R
M U S I C A N D S U P E R H E A L T H D R
 
Android os
Android osAndroid os
Android os
 
0224
02240224
0224
 
Assure unit plan
Assure unit planAssure unit plan
Assure unit plan
 
Nearpod activitat curs apps
Nearpod activitat curs appsNearpod activitat curs apps
Nearpod activitat curs apps
 
parenscript-tutorial
parenscript-tutorialparenscript-tutorial
parenscript-tutorial
 
HP brochure europa def
HP brochure europa defHP brochure europa def
HP brochure europa def
 

Similar to Lucene2 4学习笔记1

Mongo db技术分享
Mongo db技术分享Mongo db技术分享
Mongo db技术分享晓锋 陈
 
Js doc toolkit
Js doc toolkitJs doc toolkit
Js doc toolkitjay li
 
jQuery底层架构
jQuery底层架构jQuery底层架构
jQuery底层架构fangdeng
 
MySQL源码分析.01.代码结构与基本流程
MySQL源码分析.01.代码结构与基本流程MySQL源码分析.01.代码结构与基本流程
MySQL源码分析.01.代码结构与基本流程Lixun Peng
 
Keep your code clean
Keep your code cleanKeep your code clean
Keep your code cleanmacrochen
 
Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解zany_hui
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践yiditushe
 
lwdba – 開放原始碼的輕量級資料庫存取程式庫
lwdba – 開放原始碼的輕量級資料庫存取程式庫lwdba – 開放原始碼的輕量級資料庫存取程式庫
lwdba – 開放原始碼的輕量級資料庫存取程式庫建興 王
 
《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)jane2006
 
MongoDB Basics and Tutorial
MongoDB Basics and TutorialMongoDB Basics and Tutorial
MongoDB Basics and TutorialHo Kim
 
PHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsPHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsHo Kim
 
六步教你学会简单Rmi
六步教你学会简单Rmi六步教你学会简单Rmi
六步教你学会简单Rmiyiditushe
 
Js的国(转载)
Js的国(转载)Js的国(转载)
Js的国(转载)Leo Hui
 
Spring框架,技术详解及使用指导
Spring框架,技术详解及使用指导Spring框架,技术详解及使用指导
Spring框架,技术详解及使用指导yiditushe
 
Google protocol buffers简析
Google protocol buffers简析Google protocol buffers简析
Google protocol buffers简析wavefly
 
Script with engine
Script with engineScript with engine
Script with engineWebrebuild
 

Similar to Lucene2 4学习笔记1 (20)

Mongo db技术分享
Mongo db技术分享Mongo db技术分享
Mongo db技术分享
 
Js doc toolkit
Js doc toolkitJs doc toolkit
Js doc toolkit
 
J Query Learn
J Query LearnJ Query Learn
J Query Learn
 
jQuery底层架构
jQuery底层架构jQuery底层架构
jQuery底层架构
 
MySQL源码分析.01.代码结构与基本流程
MySQL源码分析.01.代码结构与基本流程MySQL源码分析.01.代码结构与基本流程
MySQL源码分析.01.代码结构与基本流程
 
Keep your code clean
Keep your code cleanKeep your code clean
Keep your code clean
 
Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解
 
A
AA
A
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践
 
lwdba – 開放原始碼的輕量級資料庫存取程式庫
lwdba – 開放原始碼的輕量級資料庫存取程式庫lwdba – 開放原始碼的輕量級資料庫存取程式庫
lwdba – 開放原始碼的輕量級資料庫存取程式庫
 
Oracle 索引介紹
Oracle 索引介紹Oracle 索引介紹
Oracle 索引介紹
 
《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)
 
Ooredis
OoredisOoredis
Ooredis
 
MongoDB Basics and Tutorial
MongoDB Basics and TutorialMongoDB Basics and Tutorial
MongoDB Basics and Tutorial
 
PHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsPHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming Skills
 
六步教你学会简单Rmi
六步教你学会简单Rmi六步教你学会简单Rmi
六步教你学会简单Rmi
 
Js的国(转载)
Js的国(转载)Js的国(转载)
Js的国(转载)
 
Spring框架,技术详解及使用指导
Spring框架,技术详解及使用指导Spring框架,技术详解及使用指导
Spring框架,技术详解及使用指导
 
Google protocol buffers简析
Google protocol buffers简析Google protocol buffers简析
Google protocol buffers简析
 
Script with engine
Script with engineScript with engine
Script with engine
 

More from yiditushe

Spring入门纲要
Spring入门纲要Spring入门纲要
Spring入门纲要yiditushe
 
J Bpm4 1中文用户手册
J Bpm4 1中文用户手册J Bpm4 1中文用户手册
J Bpm4 1中文用户手册yiditushe
 
性能测试实践2
性能测试实践2性能测试实践2
性能测试实践2yiditushe
 
性能测试实践1
性能测试实践1性能测试实践1
性能测试实践1yiditushe
 
性能测试技术
性能测试技术性能测试技术
性能测试技术yiditushe
 
Load runner测试技术
Load runner测试技术Load runner测试技术
Load runner测试技术yiditushe
 
J2 ee性能测试
J2 ee性能测试J2 ee性能测试
J2 ee性能测试yiditushe
 
面向对象的Js培训
面向对象的Js培训面向对象的Js培训
面向对象的Js培训yiditushe
 
Flex3中文教程
Flex3中文教程Flex3中文教程
Flex3中文教程yiditushe
 
开放源代码的全文检索Lucene
开放源代码的全文检索Lucene开放源代码的全文检索Lucene
开放源代码的全文检索Luceneyiditushe
 
基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍yiditushe
 
Lucene In Action
Lucene In ActionLucene In Action
Lucene In Actionyiditushe
 
Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析yiditushe
 
7 面向对象设计原则
7 面向对象设计原则7 面向对象设计原则
7 面向对象设计原则yiditushe
 
10 团队开发
10  团队开发10  团队开发
10 团队开发yiditushe
 
9 对象持久化与数据建模
9  对象持久化与数据建模9  对象持久化与数据建模
9 对象持久化与数据建模yiditushe
 
8 Uml构架建模
8  Uml构架建模8  Uml构架建模
8 Uml构架建模yiditushe
 
6 架构设计
6  架构设计6  架构设计
6 架构设计yiditushe
 
5 架构分析
5  架构分析5  架构分析
5 架构分析yiditushe
 
4 软件架构导论
4  软件架构导论4  软件架构导论
4 软件架构导论yiditushe
 

More from yiditushe (20)

Spring入门纲要
Spring入门纲要Spring入门纲要
Spring入门纲要
 
J Bpm4 1中文用户手册
J Bpm4 1中文用户手册J Bpm4 1中文用户手册
J Bpm4 1中文用户手册
 
性能测试实践2
性能测试实践2性能测试实践2
性能测试实践2
 
性能测试实践1
性能测试实践1性能测试实践1
性能测试实践1
 
性能测试技术
性能测试技术性能测试技术
性能测试技术
 
Load runner测试技术
Load runner测试技术Load runner测试技术
Load runner测试技术
 
J2 ee性能测试
J2 ee性能测试J2 ee性能测试
J2 ee性能测试
 
面向对象的Js培训
面向对象的Js培训面向对象的Js培训
面向对象的Js培训
 
Flex3中文教程
Flex3中文教程Flex3中文教程
Flex3中文教程
 
开放源代码的全文检索Lucene
开放源代码的全文检索Lucene开放源代码的全文检索Lucene
开放源代码的全文检索Lucene
 
基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍
 
Lucene In Action
Lucene In ActionLucene In Action
Lucene In Action
 
Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析
 
7 面向对象设计原则
7 面向对象设计原则7 面向对象设计原则
7 面向对象设计原则
 
10 团队开发
10  团队开发10  团队开发
10 团队开发
 
9 对象持久化与数据建模
9  对象持久化与数据建模9  对象持久化与数据建模
9 对象持久化与数据建模
 
8 Uml构架建模
8  Uml构架建模8  Uml构架建模
8 Uml构架建模
 
6 架构设计
6  架构设计6  架构设计
6 架构设计
 
5 架构分析
5  架构分析5  架构分析
5 架构分析
 
4 软件架构导论
4  软件架构导论4  软件架构导论
4 软件架构导论
 

Lucene2 4学习笔记1

  • 1. lucene2.4 学习笔记 1-( 初学 Lucene, 简单例子 ) 关键字: indexwriter hits lucene field 说明一下,这一篇文章的用到的 lucene,是用 2.4 版本的,主要在查询的时候 2.0 版本的 lucene 与以前的版本有了一些区别 下面是一个简单的例子 1.第一步建立索引 Java 代码 1. public class IndexDatebase { 2. 3. public static void main(String[] args) throws IOException { 4. //创建保存索引的目录 5. String indexDir = "d://indexDir"; 6. //创建 Directory 对象,具体的实现有 FSDirectory,RAMDirectory,MMapDirectory,NIOFSDirector 7. //FSDirectory 表示索引是放到文件里面的,RAMDirectory 是放 到内存里面 8. //new RAMDirectory() 9. Directory index = FSDirectory.getDirectory(new File(ind exDir)); 10. //创建索引 IndexWriter 对象,要四个参数,第一个是 Directory 对象,可以传 File 和 String 类型的 path 11. //new StandardAnalyzer()这个表示分析器,拆字用的,其它的 分析器还有 new ChineseAnalyzer(),new IK_CAnalyzer(),new CJKAnal yzer() 12. //第三个参数代表是新建 Index 还是在原来上面的追加,true 是新建 13. //表示分词的最大值,比如说 new MaxFieldLength(2),就表 示两个字一分,一般用 IndexWriter.MaxFieldLength.LIMITED 14. IndexWriter writer = new IndexWriter(indexDir,new Stand ardAnalyzer(),true,IndexWriter.MaxFieldLength.LIMITED); 15. //IndexWriter writer = new IndexWriter(indexDir,new Sta ndardAnalyzer(),true,new MaxFieldLength(20)); 16. addDoc(writer,"法医鉴定称湖北石南海首死亡厨师系自杀"); 17. addDoc(writer,"国务院建议珠海横琴岛划南海地交澳门管理"); 18. addDoc(writer,"印尼在南海扣 75 名中国渔民 中方要求尽快释 放南海南海南海南海南海南海南海"); 19. addDoc(writer,"南海南海南海南海南海南海南海南海南海印尼 在南海扣 75 南海南海名中国渔民 中方要求尽快释放");
  • 2. 20. addDoc(writer,"湖北洪湖一初南海中生被同学刺亡 亲属怒砸 学校 "); 21. //优化 22. writer.optimize(); 23. //关闭流 24. writer.close(); 25. 26. } 27. /** 28. * 把 Document 对象加到 Index 里面 29. * @param w 30. * @param value 31. * @throws IOException 32. */ 33. private static void addDoc(IndexWriter w, String value) thr ows IOException { 34. //新建的 Document 对象 35. Document doc = new Document(); 36. //Field(String name, String value, Store store, Index i ndex)表示保存,并建立索引,如果字段多的话,不要都建立索引 37. doc.add(new Field("title", value, Field.Store.YES,Field .Index.ANALYZED)); 38. //加进去 39. w.addDocument(doc); 40. } 41.} 2.从索引中找出相应的对象 Java 代码 1. public class QueryLucene { 2. 3. public static void main(String[] args) throws ParseExceptio n, CorruptIndexException, IOException { 4. //创建 Query,QueryParser 对象,根据 Field 建立的索引的 KEY 来搜,并设置要搜的内容 5. Query query = new QueryParser("title",new StandardAnaly zer()).parse("南海"); 6. //可以理解成读 Index 对象,Directory,File,String 都行 7. IndexSearcher indexSearch = new IndexSearcher(FSDirecto ry.getDirectory(new File("d://indexDir"))); 8. //表示查出前四个 9. TopDocCollector collector = new TopDocCollector(4);
  • 3. 10. //查找 11. indexSearch.search(query,collector); 12. //ScoreDoc 这个对象还不清楚,但是有多少结果,就有多少个 这个对象 13. ScoreDoc[] hits = collector.topDocs().scoreDocs; 14. for(int i=0;i<hits.length;++i) { 15. //找到这个 Document 原来的索引值 16. int docId = hits[i].doc; 17. System.out.println(docId); 18. //根据这个值找到对象的 Document 19. Document d = indexSearch.doc(docId); 20. System.out.println((i + 1) + ". " + d.get("title")) ; 21. } 22. 23. } 24. 25.} 1.x,2.0 和 2.4 是有一些区别的 比如说: 1 Java 代码 1. //1.x 2. IndexWriter writer = new IndexWriter(indexPath, getAnalyzer(), true); 3. //2.0,2.4 4. IndexWriter writer = new IndexWriter(indexPath, getAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED); 2. Java 代码 1. Field.Index.TOKENIZED 替换为 Field.Index.ANALYZED 2. 没啥特殊的,改了一个名字而已 3. Java 代码
  • 4. 1. IndexWriter.flush(); 2. 替换为 3. IndexWriter.commit(); 4.org.apache.lucene.search.Hits; 这个类将在 3.0 中被删除 新的使用方法在上面的例子中 5.Field 的创建 Java 代码 1. 在 2.0+中 2. Field 没了 Keyword、UnIndexed、UnStored、Text 这几个静态成员,只能用 3. Field(String, String, Store, Index)。 4. Keyword 对应 Field.Store.YES, Field.Index.UN_TOKENIZED, 5. UnIndexed 对应 Field.Store.YES, Field.Index.NO, 6. UnStored 对应 Field.Store.NO, Field.Index.TOKENIZED, 7. Text 对应 Field.Store.YES, Field.Index.TOKENIZED 8. //2.0 版本以上 9. Field(String name, byte[] value, Field.Store store) 10. // Create a stored field with binary value. 11.Field(String name, Reader reader) 12. // Create a tokenized and indexed field that is not s tored. 13.Field(String name, Reader reader, Field.TermVector termVector) 14. // Create a tokenized and indexed field that is not s tored, optionally with storing term vectors. 15.Field(String name, String value, Field.Store store, Field.Index index) 16. // Create a field by specifying its name, value and h ow it will be saved in the index. 17.Field(String name, String value, Field.Store store, Field.Index index, Field.TermVector termVector) 18. // Create a field by specifying its name, value and h ow it will be saved in the index. Field.Store 表示“是否存储”,即该 Field 内的信息是否要被原封不动的保 存在索引中。
  • 5. Field.Index 表示“是否索引”,即在这个 Field 中的数据是否在将来检索时 需要被用户检索到,一个“不索引”的 Field 通常仅是提供辅助信息储存的功 能。 Field.TermVector 表示“是否切词”,即在这个 Field 中的数据是否需要被切 词。 通常,参数用 Reader,表示在文本流数据源中获取数据,数据量一般会比较大。 像链接地址 URL、文件系统路径信息、 时间日期、人名、 居民身份证、 电话号码等等 通常将被索引并且完整的存储在索引中,但一般不需要切分词,通常用上面的 第四个构造函数,第三四个参数分别为 Field.Store.YES, Field.Index.YES。 而长文本通常可用第 3 个构造函数。 IndexSearch 类 查询器 搜索入口,继承自 Search 1.public IndexSearcher(Directory directory) 使用方法 String IndexPath="D:/IndexPath"; Directory directory=FSDirectory.getDirectory(IndexPath); IndexSearcher searcher=new IndexSearcher(directory); 支持 RAM 存储的索引,提高检索速度,建议使用,因为此方法将索引存放的路径与搜索分离 2.public IndexSearcher(String path) 直接操作索引目录.不支持 RAM 存储的索引 IndexSearcher searcher=new IndexSearcher("D:/IndexPath"); 3.public IndexSearcher(IndexReader r) IndexSearcher searcher=IndexSearcher(reader); 4.private IndexSearcher(IndexReader r, boolean closeReader) 在 3 的 基 础 上 对 了 判 断 在 关 闭 IndexSearcher 时 是 否 要 关 闭 所 带 的 IndexReader 对 象 的 boolean 类型参数 多索引目录就是要在多个索引目录的中进行比较搜索,类似概念在 SQL 中就是 select * from TableA union select * from TableB。 IndexSearcher[] searchers = new IndexSearcher[2]; searchers[0] = new IndexSearcher(IndexPath0); searchers[1] = new IndexSearcher(IndexPath1); IndexSearcher 类的主要方法 Search 通过重载实现多种检索方式.通过其参数控制检索. 参数解释 Weigth weigth 权重 指定索引中文档重要性参数,改变默认其值
  • 6. HitCollector results 保存搜索的所有结果. Filter filter 指定对结果进行过滤的方式 Query query 每个 Search 必须的对象参数.指定检索的方式 Sort sort 指定检索排序的方法.可自定义排序方式进行结果的排序和输出 Query 有很多的子类 指定了不同的查询方式,query 是用户输入的内容,analyzer 是用来将用 户输入的内容也作分析处理 TermQuery Term t=new Term(”contents”,”lucene”); 构造 TermQuery 把查询条件视为一个 key, 要求和查询 内容完全匹配,比如 Field.Keyword 类型就可以使用 TermQuery RangeQuery 区间检索 RangeQuery 表 示 一 个 范 围 的 搜 索 条 件 , 在 年 龄 , 日 期 , 工 资 等 数 字 类 的 索 引 库 中 常 用 R,angeQuery query = new RangeQuery(begin, end, included); 类似 sql 中 betwee...and..... 最后一 个 boolean 值表示是否包含边界条件本身 , 用字符表示为”[begin TO end]” 或者”{begin TO end}” PrefixQuery 字符串前缀检索,如"sys*" BooleanQuery 逻辑组合检索 组合的 Query,你可以把各种 Query 添加进去并标明他们的逻辑关系,添加条件用 public void add(Query query, boolean required, boolean prohibited) 方 法 , 后 两 个 boolean 变 量 是 标示 AND OR NOT 三种关系 字符表示为” AND OR NOT” 或 “+ -” ,一个 BooleanQuery 中可以添加多个 Query, 如果超过 setMaxClauseCount(int) 的值 ( 默认 1024 个 ) 的话 , 会抛出 TooManyClauses 错误. PhraseQuery 短语检索 PhraseQuery 所以提供了一个 setSlop()参数,在查询中 ,lucene 会尝试调整单词的距离和位置 , 这个参数表示可以接受调整次数限制,如果实际的内容可以在这么多步内调整为完全匹配,那 么就被视为匹配 . 在默认情况下 slop 的值是 0, 所以默认是不支持非严格匹配的 , 通过设置 slop 参数(比如”red pig”匹配”red fat pig”就需要 1 个 slop 来把 pig 后移动 1 位),我们可以让 lucene 来模糊查询. 值得注意的是,PhraseQuery 不保证前后单词的次序 ,在上面的例子中,”pig red”需要 2 个 slop,也就是如果 slop 如果大于等于 2,那么”pig red”也会被认为是匹配的. WildcardQuery 通配符检索 使用?和*来表示一个或多个字母比如 sys*可以匹配 system ,systop,systaltic…, FuzzyQuery 模糊搜索 一般不处理中文,处理于英文的各种时态变化和复数形式,匹配结果的相关度是不一样的. QueryParser 使用 QueryParser 将用户输入转为 Query 或者 Query 组, 将 Query 的字符表示(Query.toString)转化 为实际的 Query 对象, Hit 搜索结果的处理:Hits 对象
  • 7. Hits 对象是搜索结果的集合 主要有下面几个方法 1.length() , 记录有多少条结果返回 2.doc(n) 返回第 n 个记录 3.id(in) 返回第 n 个记录的 Document ID 4.score(n) 第 n 个记录的相关度(积分) 本 文 来 自 CSDN 博 客 , 转 载 请 标 明 出 处 : http://blog.csdn.net/lwlsoftware/archive/2009/02/21/3916082.aspx