随笔-54  评论-0  文章-2  trackbacks-0
 
           Lucene

今天由汤阳光老师(不如说是汤兄)给我们讲lucene,一见汤兄,太年轻了,真是这感觉真让我有些小惭愧,呵呵。。。还是学好技术是第一要务。

从 现在到年前都是汤兄给我们上课,今天和明天是搜索引擎,存储数据用的是Hibernate,全文检索的简化框架是Compass,Lucene讲1.5 天,Compass讲半天。总结一天所学的.全文检索是目前最流行的技术,由于用数据库搜索实现的匹配度,相关度排序和搜索速度太慢,而这些都非常致命。 下面详细回顾:

1.信息检索:找出与用户需求相关的信息

平时接触的信息有文:html,doc,pdf和 txt,

多媒体:音频,视频,图片...

全文检索:  1.只关注文本。比如我搜索:中国的首都在哪里?和我搜索中国 首都 北京是一样的,我们主要是研究出现了某些词的文本 2.不处理语义,只是词匹配

全文检索的作用:1.bbs,blog,news,商城的站内搜索,资源有限

Eclipse的帮助就是用Lucene做的

2.入门

运行原理/入门概念

Hello World

需求:就像百度的搜索框一样,输入内容,点击搜索,得出结果,并且要求时间非常短
后台:点搜索后,会去信息集合(索引库)里搜索,注:这个索引库是按照一定的结构存储,这个结构可以实现快速搜索
使用流程:1事先就不停再找,建立索引,2.搜索
索引库的结构:索引库是存到一些二进制文件,这些文件在同一个目录下  --à索引库目录
Document  一条数据
Field  数据中的一个字段

Field是组成Document的元素

实现:
步骤:1.建立索引

      2.搜索

      都用到的是分词器(analyzer),应使用同一种分词器

实现HelloWorld:添加jar包

lucene-core-2.4.0.jar(核心);
contrib/analyzers/lucene-analyzers-2.4.0.jar(分词器);
contrib/highlighter/lucene-highlighter-2.4.0.jar(高亮器);
  1.建立Article.java,属性有id,title,content
 2.HelloWorld.java.两个主要方法:
    1.建立索引:
     createIndex()    
    2.搜索
    search()
进行搜索
public void search() throws Exception {
    String queryString = "document";
    // 1,把要搜索的文本解析为 Query
    String[] fields = { "name", "content" };
   QueryParser queryParser = new MultiFieldQueryParser(fields, analyzer);
    Query query = queryParser.parse(queryString);
 
    // 2,进行查询
    IndexSearcher indexSearcher = new IndexSearcher(indexPath);
    Filter filter = null;
    TopDocs topDocs = indexSearcher.search(query, filter, 10000);
    System.out.println("总共有【"+topDocs.totalHits+"】条匹配结果");
       // 3,打印结果
    for(ScoreDoc scoreDoc : topDocs.scoreDocs){
       int docSn = scoreDoc.doc; // 文档内部编号
       Document doc = indexSearcher.doc(docSn); // 根据编号取出相应的文档
       File2DocumentUtils.printDocumentInfo(doc; // 打印出文档信息
    }
}

IndexWriter:操作索引库,增删改
主要方法介绍:

       // 构造方法:如果索引库不存在,会自动创建。如果存在,就使用他
       new IndexWriter(String/Directory indexPath, Analyzer a, MaxFieldLength mfl)
       // 构造方法:第三个参数指定是否创建一个新的索引库。
       // 1,有索引库,create为true:会重新创建。2,没有索引库,create为false,会报错。
       new IndexWriter(String/Directory indexPath, Analyzer a, boolean create, MaxFieldLe
ngth mfl)
       // 添加索引
       addDocument( Document doc )
       // 更新
       updateDocument(Term term, Document doc)
       // 删除
       deleteDocument(Term term)
       // 合并索引库
       addIndexesNoOptimize(Directory[])

今天学了Lucene的入门,明天学习Lucene的高级知识,以及compass框架!
       // 优化索引库
       optimize()
IndexSearcher:操作索引库,查询
       // 构造方法,索引库不存在,就报错
       new IndexSearcher( String indexPath )
       // 搜索
       TopDocs search( Query query, Filter filer, int n )
       // 搜索
       TopDocs search( Query query, Filter filer, int n , Sort sort)
      
Document doc( int docSn )
Documet:Lucene所操作的对象
Field:组成Document的元素,代表一个属性。Store、Index
  new Field( String name, String value, Store store, Index index )

Directory:索引库(目录)
       FSDirectory    :真实的目录
       RAMDirectory:在内存中的一个虚拟的目录
 
QueryParser:把查询字符串变为查询对象的工具。使用子类: MultiFieldQueryParser
      new MultiFieldQueryParser(String[] fields, Analyzer a)
Term:代表某个属性中的一个关键词(目录中出现的条目),是搜索的最小单位
Query :查询对象(封装的过滤条件)。有很多子类,对应各种各样的查询方式。
TopDocs(一套) :代表查询结果
今天知识比较少,可回顾以前的知识,呵呵。。。
posted on 2010-01-31 23:33 d66380022 阅读(956) 评论(0)  编辑  收藏