新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     >>计算机科学论坛<<     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 搜索引擎, 信息分类与检索, 语义搜索, Lucene, Nutch, GRUB, Larbin, Weka
    [返回] 计算机科学论坛计算机技术与应用『 Web挖掘技术 』 → Lucene入门与使用 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 19041 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: Lucene入门与使用 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     admin 帅哥哟,离线,有人找我吗?
      
      
      
      威望:9
      头衔:W3China站长
      等级:计算机硕士学位(管理员)
      文章:5255
      积分:18406
      门派:W3CHINA.ORG
      注册:2003/10/5

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给admin发送一个短消息 把admin加入好友 查看admin的个人资料 搜索admin在『 Web挖掘技术 』 的所有贴子 点击这里发送电邮给admin  访问admin的主页 引用回复这个贴子 回复这个贴子 查看admin的博客楼主
    发贴心情 Lucene入门与使用


    转自:http://linux.ydqmx.net/read.php?wid=31

    Lucene入门与使用

    发布于2005-11-20 被读61次 【字体:大 中 小】 返回 打印


    1.1 Lucene 历史

          org.apache.lucene包是纯java语言的全文索引检索工具包。
          Lucene的作者是资深的全文索引/检索专家,最开始发布在他本人的主页上,2001年10月贡献给APACHE,成为APACHE基金jakarta的一个子项目。
          目前,lucene广泛用于全文索引/检索的项目中。
          lucene也被翻译成C#版本,目前发展为Lucene.Net(不过最近好象有流产的消息)。


    1.2 Lucene 原理


           lucene的检索算法属于索引检索,即用空间来换取时间,对需要检索的文件、字符流进行全文索引,在检索的时候对索引进行快速的检索,得到检索位置,这个位置记录检索词出现的文件路径或者某个关键词。
           在使用数据库的项目中,不使用数据库进行检索的原因主要是:数据库在非精确查询的时候使用查询语言“like %keyword%”,对数据库进行查询是对所有记录遍历,并对字段进行“%keyword%”匹配,在数据库的数据庞大以及某个字段存储的数据量庞大的时候,这种遍历是致命的,它需要对所有的记录进行匹配查询。因此,lucene主要适用于文档集的全文检索,以及海量数据库的模糊检索,特别是对数据库的 xml或者大数据的字符类型。


    2.Lucene的下载和配置


    2.1 Lucene的下载


           lucene在jakarta项目中的发布主页:http://jakarta.apache.org/lucene/docs/index.html。以下主要针对windows用户,其它用户请在上面的地址中查找相关下载。


           lucene的.jar包的下载(包括.jar和一个范例demo):
    http://apache.oregonstate.edu/jakarta/lucene/binaries/lucene-1.4-final.zip


            lucene的源代码下载:
    http://www.signal42.com/mirrors/apache/jakarta/lucene/source/lucene-1.4-final-src.zip


    lucene的api地址:http://jakarta.apache.org/lucene/docs/api/index.html


    本文使用lucene版本:lucene-1.4-final.jar。


    2.2 lucene的配置


            首先请确定你的机子已经进行了java使用环境的基本配置,即确保在某个平台下能够运行java源代码,否则请查阅相关文档进行配置。
            接下来进入lucene的配置:
            普通使用者:在环境变量的CLASSPATH中添加lucene的位置。比如:“D:\\java \\lucene-1.4-final\\lucene-1.4-final.jar;”。
           jbuilder使用者:在“Project”--“Project Properties”--“Required Libraries”进行添加。
           Jsp使用者:也可以直接将lucene-1.4-final.jar文件放到\\WEB-INF\\classes下。


    3. Lucene 的范例(Demo )


    3.1 Demo说明

         
            可以得到的Demo包括:lucene-demos-1.4-final、XMLIndexingDemo,lucene-demos-1.4- final中包括对普通文件和html文件的两种索引,XMLIndexingDemo针对xml文件的索引。他们的区别主要在于:对普通文件进行索引时只要对文件的全文进行索引,而针对html、xml文件时,对标签类型不能进行索引,在实现上:html、xml的索引需要额外的数据流分析器,以分析哪些内容有用哪些无用。因此,在后两者实现上,索引的时间额外开支,甚至超过索引本身时间,而检索时间没有区别。


            以上Demo中,lucene-demos-1.4-final自带于lucene-1.4-final.zip中,XMLIndexingDemo的下载地址:
    http://cvs.apache.org/viewcvs.cgi/jakarta-lucene-sandbox/contributions/XML-Indexing-Demo/


    3.2 Demo的运行


            首先将demo.jar的路径添加如环境变量的CLASSPATH中,例如:“D:\\java\\lucene-1.4-final\\lucene-demos-1.4-final.jar;”,同时确保已经添加lucene-1.4-final.jar。


            然后进行文件的全文索引,在dos控制台中,输入命令“java org.apache.lucene.demo.IndexFiles {full-path-to-lucene}/src”,后面的路径为所要进行索引的文件夹,例如:“java org.apache.lucene.demo.IndexFiles c:\\test”。


            接着对索引进行检索,敲入“java org.apache.lucene.demo.SearchFiles”,在提示“Query:”后输入检索词,程序将进行检索列出检索得到的结果(检索词出现的文件路径)。

           其他Demo的运行请参考\\docs\\demo.html。
           在运行Demo后请阅读Demo的源代码以便深入学习。

    4. 利用Lucene进行索引


            进行lucene的熟悉后,我们将学习如何使用Lucene。
    一段索引的应用实例:

        //需要捕捉IOException异常
        //建立一个IndexWriter,索引保存目录为“index”
        String[] stopStrs = {
            \"他奶奶的\", \"***\"};
        StandardAnalyzer analyzer = new StandardAnalyzer(stopStrs);
        IndexWriter writer = new IndexWriter(\"index\", analyzer, true);
       
        //添加一条文档
        Document doc = new Document();
        doc.add(Field.UnIndexed(\"id\", \"1\"));//“id”为字段名,“1”为字段值
        doc.add(Field.Text(\"text\", \"***,他奶奶的,入门与使用\"));
        writer.addDocument(doc);
       
        //索引完成后的处理
        writer.optimize();
        writer.close();

           看完这段实例后,我们开始熟悉lucene的使用:

    4.1 Lucene的索引接口


    在学习索引的时候,首先需要熟悉几个接口:


    4.1.1分析器Analyzer


            分析器主要工作是筛选,一段文档进来以后,经过它,出去的时候只剩下那些有用的部分,其他则剔除。而这个分析器也可以自己根据需要而编写。
            org.apache.lucene.analysis.Analyzer:这是一个虚构类,以下两个借口均继承它而来。


            org.apache.lucene.analysis.SimpleAnalyzer:分析器,支持最简单拉丁语言。


            org.apache.lucene.analysis.standard.StandardAnalyzer:标准分析器,除了拉丁语言还支持亚洲语言,并在一些匹配功能上进行完善。在这个接口中还有一个很重要的构造函数:StandardAnalyzer(String [] stopWords),可以对分析器定义一些使用词语,这不仅可以免除检索一些无用信息,而且还可以在检索中定义禁止的政治性、非法性的检索关键词。


    4.1.2 IndexWriter


            IndexWriter的构造函数有三种接口,针对目录Directory、文件File、文件路径String三种情况。
    例如IndexWriter(String path, Analyzer a, boolean create),path为文件路径,a为分析器,create标志是否重建索引(true:建立或者覆盖已存在的索引,false:扩展已存在的索引。)
           一些重要的方法:

    接口名

    备注

    addDocument(Document doc)

    索引添加一个文档

    addIndexes(Directory[] dirs)

    将目录中已存在索引添加到这个索引

    addIndexes(IndexReader[] readers)

    将提供的索引添加到这个索引

    optimize()

    合并索引并优化

    close()

    关闭


           IndexWriter为了减少大量的io维护操作,在每得到一定量的索引后建立新的小索引文件(笔者测试索引批量的最小单位为10),然后再定期将它们整合到一个索引文件中,因此在索引结束时必须进行wirter. optimize(),以便将所有索引合并优化。


    4.1.3 org.apache.lucene.document


    以下介绍两种主要的类:
    a)org.apache.lucene.document.Document:
            Document文档类似数据库中的一条记录,可以由好几个字段(Field)组成,并且字段可以套用不同的类型(详细见b)。Document的几种接口:

    接口名

    备注

    add(Field field)

    添加一个字段(Field)到Document中

    String get(String name)

    从文档中获得一个字段对应的文本

    Field getField(String name)

    由字段名获得字段值

    Field[] getFields(String name)

    由字段名获得字段值的集


    b)org.apache.lucene.document.Field
            即上文所说的“字段”,它是Document的片段section。
            Field的构造函数:
           Field(String name, String string, boolean store, boolean index, boolean token)。
            Indexed:如果字段是Indexed的,表示这个字段是可检索的。
            Stored:如果字段是Stored的,表示这个字段的值可以从检索结果中得到。
            Tokenized:如果一个字段是Tokenized的,表示它是有经过Analyzer转变后成为一个tokens序列,在这个转变过程tokenization中, Analyzer提取出需要进行索引的文本,而剔除一些冗余的词句(例如:a,the,they等,详见 org.apache.lucene.analysis.StopAnalyzer.ENGLISH_STOP_WORDS和 org.apache.lucene.analysis.standard.StandardAnalyzer(String[] stopWords)的API)。Token是索引时候的基本单元,代表一个被索引的词,例如一个英文单词,或者一个汉字。因此,所有包含中文的文本都必须是Tokenized的。
         Field的几种接口:

    Name

    Stored

    Indexed

    Tokenized

    use

    Keyword(String name,

            String value)

    Y

    Y

    N

    date,url

    Text(String name, Reader value)

    N

    Y

    Y

    short text fields:

    title,subject

    Text(String name, String value)

    Y

    Y

    Y

    longer text fields,

    like “body”

    UnIndexed(String name,

    String value)

    Y

    N

    N

    UnStored(String name,

             String value)

    N

    Y

    Y


    5. 利用Lucene进行检索


    5.1 一段简单的检索代码

        //需要捕捉IOException,ParseException异常
        //处理检索条件
        Query query = QueryParser.parse(\"入门\", \"text\", analyzer);

        //检索
        Searcher searcher = new IndexSearcher(\"./index\");//\"index\"指定索引文件位置
        Hits hits = searcher.search(query);

        //打印结果值集
        for (int i = 0; i < hits.length(); i++) {
          Document doc = hits.doc(i);
          String id = doc.get(\"id\");
          System.out.println(\"found \" + \"入门\" + \" on the id:\" + id);
        }

    5.2 利用Lucene的检索接口


    5.2.1 Query与QueryParser


            主要使用方法:
    QueryParser .parse(String query, String field, Analyzer analyzer),例如:
    Query query = QueryParser.parse(\"入门\", \"text\", analyzer);
    \"入门\"为检索词, \"text\"为检索的字段名, analyzer为分析器


    5.2.2 Hits与Searcher


           Hits的主要使用接口:

    接口名

    备注

    Doc(int n)

    返回第n个的文档的所有字段

    length()

    返回这个集中的可用个数


    6. Lucene的其他使用


    6.1 Lucene 的索引修改


            下面给出一段修改索引的代码,请根据Lucene的API解读:


      /**
       * 对已有的索引添加新的一条索引
       * @param idStr String:要修改的id
       * @param doc Document:要修改的值
       */
      public void addIndex(String idStr, String valueStr) {
        StandardAnalyzer analyzer = new StandardAnalyzer();
        IndexWriter writer = null;
        try {
          writer = new IndexWriter(indexPath, analyzer, false);
          writer.mergeFactor = 2; //修正lucene 1.4.2 bug,否则不能正确反映修改

          Document doc = new Document();
          doc.add(Field.UnIndexed(\"id\", idStr));//“id”为字段名,“1”为字段值
          doc.add(Field.Text(\"text\", valueStr));
          writer.addDocument(doc);

          writer.optimize();
          writer.close();
        }
        catch (IOException ioe) {
          ioe.printStackTrace();
        }
      }

      /**
       * 删除索引
       *
       * @param idStr String
       */
      public void deleteIndex(String idStr) {
        try {
          Directory dirt = FSDirectory.getDirectory(indexPath, false);
          IndexReader reader = IndexReader.open(dirt);
          Term term = new Term(\"text\", idStr);
          reader.delete(term);
          reader.close();
          dirt.close();
        }
        catch (IOException ioe) {
          ioe.printStackTrace();
        }
      }


    6.2 Lucene 的检索结果排序


            Lucene的排序主要是对org.apache.lucene.search.Sort的使用。Sort可以直接根据字段Field生成,也可以根据标准的SortField生成,但是作为Sort的字段,必须符合以下的条件:唯一值以及Indexed。可以对Integers, Floats, Strings三种类型排序。
            对整数型的ID检索结果排序只要进行以下的简单操作:

    Sort sort = new Sort(\"id\");
    Hits hits = searcher.search(query, sort);

           用户还可以根据自己定义更加复杂的排序,详细请参考API。

    7 总结

            Lucene给java的全文索引检索带来了非常强大的力量,以上仅对Lucene进行简单的入门说明。

    xio@qq.com

    参考资料:
    1. Overview (Lucene 1.4-final API)
    2. 车东 《在应用中加入全文检索功能--基于JAVA的全文索引引擎Lucene简介》
    3. http://www.mail-archive.com/lucene-user@jakarta.apache.org/index.html


       收藏   分享  
    顶(0)
      




    ----------------------------------------------

    -----------------------------------------------

    第十二章第一节《用ROR创建面向资源的服务》
    第十二章第二节《用Restlet创建面向资源的服务》
    第三章《REST式服务有什么不同》
    InfoQ SOA首席编辑胡键评《RESTful Web Services中文版》
    [InfoQ文章]解答有关REST的十点疑惑

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/30 11:44:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Web挖掘技术 』 的所有贴子 点击这里发送电邮给Google AdSense  访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/23 22:54:53

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    62.500ms