初学lucene

 首先分别new 一个Document,IndexWriter,Field,  然后用Doument.add()方法加入Field.  其次用IndexWrtier.addDocument()方法加入Document。  最后调用一下IndexWriter.close()方法关闭输入索引,  这一步非常的重要只有调用这个方法索引才会被写入索引的目录里,而这是被很多初学的人所忽略的。  Document没有什么好介绍的,把它的作用看成数据库中的一行记录就行。  IndexWriter writer = new IndexWriter("d://indexs",new StandardAnalyzer(),true);  可以说是创建一个新的写入工具         第一个参数是要索引建立在哪个目录里         第二个参数是新建一个文本分析器,这里用的是标准的大家也可以自己写一个         第三个参数如果是true,在建立索引之前先将c://index目录清空。 Field是一个比较重要的也是比较复杂的,看一下它的构造函数有5个: Field(String name, byte[] value, Field.Store store) Field(String name, Reader reader) Field(String name, Reader reader, Field.TermVector termVector) Field (String name, String value, Field.Store store, Field.Index index) Field (String name, String value, Field.Store store, Field.Index index, Field.TermVector termVector) 在Field中有三个内部类:Field.Index,Field.Store,Field.termVector, 而构造函数也用到了它们。 注意:termVector是Lucene 1.4新增的,它提供一种向量机制来进行模糊查询,这个不常用。 它们的不同的组合,在全文检索中有着不同的作用。看看下面的表吧: Field.Index         Field.Store    说明 TOKENIZED(分词)   YES      被分词索引且存储 TOKENIZED    NO       被分词索引但不存储 NO      YES      这是不能被搜索的,它只是被搜索内容的附属物。如URL等 UN_TOKENIZED   YES/NO      不被分词,它作为一个整体被搜索,搜一部分是搜不出来的 NO      NO       没有这种用法

下面介绍一下IndexWriter: 它就是一个写入索引的写入器,它的任务比较简单: 1.用addDocument()将已经准备好写入索引的document们加入 2.调用close()将索引写入索引目录

先看一下它的构造函数: IndexWriter (Directory d, Analyzer a, boolean create) IndexWriter (File path, Analyzer a, boolean create) IndexWriter (String path, Analyzer a, boolean create) 可见构造它需要一个索引文件目录,一个分析器(一般用标准的这个),最后一个参数是标识是否清空索引目录 它有一些设置参数的功能如:设置Field的最大长度 1.设置Field的长度限制只是限制了搜索。如果用了Field.Store.YES的话还是会 全部被保存进索引目录里的。 2.为什么搜the没有搜出来呢?是因为lucene分析英文的时候不会搜索the to of 等无用的词(搜这些词是无意义的)。 3.New StandardAnlayzer()对于英文的分词是按空格和一些无用的词,而中文呢是全部的单个的字。 4.设置Field的最大长度是以0开头和数组一样。 到现在我们已经可以用lucene建立索引了 下面介绍一下几个功能来完善一下: 1.索引格式       其实索引目录有两种格式,       一种是除配置文件外,每一个Document独立成为一个文件(这种搜索起来会影响速度)。       另一种是全部Document成一个文件,这样属于复合模式就快了。 2.索引文件可放的位置:     索引可以存放在两个地方1.硬盘,2.内存。放在硬盘上可以用FSDirectory(),放在内存的用RAMDirectory()不过一关机就没了。  FSDirectory.getDirectory (File file, boolean create)  FSDirectory.getDirectory(String path, boolean create)两个工厂方法返回目录  New RAMDirectory() 就直接可以,再和IndexWriter(Directory d, Analyzer a, boolean create) 一配合就行了  如:  IndexWrtier indexWriter = new IndexWriter(FSDirectory.getDirectory(“c://index”,true),new StandardAnlyazer(),true);  IndexWrtier indexWriter = new IndexWriter(new RAMDirectory(),new StandardAnlyazer(),true); 3.索引的合并     这个可用IndexWriter.addIndexes(Directory[] dirs) 将目录加进去 4.对索引的其它操作:  IndexReader类是用来操作索引的,它有对Document,Field的删除等操作。  下面一部分的内容是:全文的搜索      全文的搜索主要是用:IndexSearcher,Query,Hits,Document(都是Query的子类),有的时候用QueryParser   主要步骤:      1.new QueryParser(Field字段,new 分析器)     2.Query query = QueryParser.parser(“要查询的字串”);这个地方我们可以用反射api看一下query究竟是什么类型      3.new IndexSearcher(索引目录).search(query);返回Hits      4.用Hits.doc(n);可以遍历出Document      5.用Document可得到Field的具体信息了。 其实1 ,2两步就是为了弄出个Query 实例,究竟是什么类型的看分析器了。     拿以前的例子来说吧         QueryParser queryParser = new QueryParser("name",new StandardAnalyzer());         Query query = queryParser.parse("程序员"); //这里返回的就是org.apache.lucene.search.PhraseQuery        IndexSearcher indexSearcher =new IndexSearcher("c://indexDisk");        Hits hits = indexSearcher.search(query);          不管是什么类型,无非返回的就是Query的子类,我们完全可以不用这两步直接new个Query的子类的实例就ok了,     不过一般还是用这两步因为它返回的是PhraseQuery这个是非常强大的query子类,它可以进行多字搜索。     用QueryParser可以设置各个关键字之间的关系这个是最常用的了。     IndexSearcher:    其实IndexSearcher它内部自带了一个IndexReader用来读取索引的,IndexSearcher有个close()方法,     这个方法不是用来关闭IndexSearcher的是用来关闭自带的IndexReader。      QueryParser呢可以用parser.setOperator()来设置各个关键字之间的关系,它可以自动通过空格从字串里面将关键字分离出来。           注意:用QueryParser搜索的时候分析器一定的和建立索引时候用的分析器是一样的。       Query:  可以看一个lucene2.0的帮助文档有很多的子类:            BooleanQuery, ConstantScoreQuery, ConstantScoreRangeQuery, DisjunctionMaxQuery, FilteredQuery, MatchAllDocsQuery, MultiPhraseQuery, MultiTermQuery, PhraseQuery, PrefixQuery, RangeQuery, SpanQuery, TermQuery      各自有用法看一下文档就能知道它们的用法了    下面一部分讲一下lucene的分析器:       分析器是由分词器和过滤器组成的,   拿英文来说吧分词器就是通过空格把单词分开,    过滤器就是把the,to,of等词去掉不被搜索和索引。       我们最常用的是StandardAnalyzer()它是lucene的标准分析器它集成了内部的许多的分析器。    最后一部分了:lucene的高级搜索了      1.排序       Lucene有内置的排序用IndexSearcher.search(query,sort)但是功能并不理想。我们需要自己实现自定义的排序。       这样的话得实现两个接口: ScoreDocComparator, SortComparatorSource                 用IndexSearcher.search(query,new Sort(new SortField(String Field,SortComparatorSource)));

  2.多域搜索 MultiFieldQueryParser

 1.如果想输入关键字而不想关心是在哪个Field里的就可以用MultiFieldQueryParser了。  用它的构造函数即可后面的和一个Field一样。  MultiFieldQueryParser. parse (String[] queries, String[] fields, BooleanClause.Occur[] flags, Analyzer analyzer)                                          

 第三个参数比较特殊这里也是与以前lucene1.4.3不一样的地方,看一个例子就知道了。  String[] fields = {"filename", "contents", "description"};  BooleanClause.Occur[] flags = {BooleanClause.Occur.SHOULD,  BooleanClause.Occur.MUST,//在这个Field里必须出现的  BooleanClause.Occur.MUST_NOT};//在这个Field里不能出现  MultiFieldQueryParser.parse("query", fields, flags, analyzer);

 2.多索引搜索 MultiSearcher  在构造的时候传进去一个Searcher数组即可

 3.过滤器Filter

Document 类中一些方法:  public final void add(Field field)  添加Field  public final void removeField(String name)     删除一个Field  public final void removeFields(String name) 删除多个Field  public final Field getField(String name) 根据一个名字获得Field的实例  public final String get(String name) 取出Field的值,也就是数据源的值  public final Enumeration fields() 得到一个所有Field的枚举  public final Field[] getFields(String name) 根据名称得到一个Field的数组  public final String[] getValues(String name) 根据名称得到一个Feild的值的数组       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值