注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Koala++'s blog

计算广告学 RTB

 
 
 

日志

 
 

Lucene源代码分析[Document,Term]  

2009-07-04 19:13:50|  分类: Lucene |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

public final class Document implements java.io.Serializable {

    List fields = new Vector();

    private float boost = 1.0f;

 

    public Document() {

    }

 

    public void setBoost(float boost) {

       this.boost = boost;

    }

 

    public float getBoost() {

       return boost;

    }

 

    public final void add(Field field) {

       fields.add(field);

    }

 

    public final void removeField(String name) {

       Iterator it = fields.iterator();

       while (it.hasNext()) {

           Field field = (Field) it.next();

           if (field.name().equals(name)) {

              it.remove();

              return;

           }

       }

    }

 

    public final void removeFields(String name) {

       Iterator it = fields.iterator();

       while (it.hasNext()) {

           Field field = (Field) it.next();

           if (field.name().equals(name)) {

              it.remove();

           }

       }

    }

 

    public final Field getField(String name) {

       for (int i = 0; i < fields.size(); i++) {

           Field field = (Field) fields.get(i);

           if (field.name().equals(name))

              return field;

       }

       return null;

    }

 

    public final String get(String name) {

       for (int i = 0; i < fields.size(); i++) {

           Field field = (Field) fields.get(i);

           if (field.name().equals(name) && (!field.isBinary()))

              return field.stringValue();

       }

       return null;

    }

 

    public final Enumeration fields() {

       return ((Vector) fields).elements();

    }

 

    public final Field[] getFields(String name) {

       List result = new ArrayList();

       for (int i = 0; i < fields.size(); i++) {

           Field field = (Field) fields.get(i);

           if (field.name().equals(name)) {

              result.add(field);

           }

       }

 

       if (result.size() == 0)

           return null;

 

       return (Field[]) result.toArray(new Field[result.size()]);

    }

 

    public final String[] getValues(String name) {

       List result = new ArrayList();

       for (int i = 0; i < fields.size(); i++) {

           Field field = (Field) fields.get(i);

           if (field.name().equals(name) && (!field.isBinary()))

              result.add(field.stringValue());

       }

 

       if (result.size() == 0)

           return null;

 

       return (String[]) result.toArray(new String[result.size()]);

    }

}

    Document是索引和搜索的一个单位,一个Document是一个field集合,每一个field都有一个名字和文本值,一个field也许在document中保存,在它被搜索到的时候,它可以被返回,也就是每一个document至少应该保存一个field来实别它,注意,Field.isStoredfalsefields是不可以从索引中取得的,比如Hit.docSearcher.docIndexReader.document

Ø  setBoost(float boost),设置这个document中的任一field,这个值会使所有搜索到这个文档的score值乘以所设的值。这个所设的值会乘以这个文档中所有的field

Ø  getBoost(),得到boost因子的值,默认值是1.0,注意这个值在索引中并不是直接保存在document中,所以IndexReader.documentHit.doc返回的douments可能会和文档被索引时有不同的值。

Ø  add(Field field),加入一个field到文档中,可能有几个加入的field有相同的名字,这种情况下,如果这些fields被索引,那么它们的文本在搜索时相当于追加的。注意,与removeField相似,只有一个document加入到index之前才是有意义的,这些方法不能用于改变已经加入的索引,要想改变索引,必须先在index中删除一个document,改变后再加入这个文档。

Ø  removeField(String name),用一个特定的field名称来删除一个field,如果有多个field有相同的名字,那么这个方法只删除第一个被加入的field。如果文档中不存在一个field名字与特写的名字一样,那么document不改变。

Ø  getField(String name),返回指定名字的field,如果有多个field这个相同的名字,返回第一个被加入的field

 

public final class Term implements Comparable, java.io.Serializable {

    String field;

 

    String text;

 

    /** Constructs a Term with the given field and text. */

    public Term(String fld, String txt) {

       this(fld, txt, true);

    }

 

    Term(String fld, String txt, boolean intern) {

       field = intern ? fld.intern() : fld; // field names are interned

       text = txt; // unless already known to be

    }

 

    public final String field() {

       return field;

    }

 

    public final String text() {

       return text;

    }

 

    public Term createTerm(String text) {

       return new Term(field, text, false);

    }

 

    public final boolean equals(Object o) {

       if (o == null)

           return false;

       Term other = (Term) o;

       return field == other.field && text.equals(other.text);

    }

 

    /** Combines the hashCode() of the field and the text. */

    public final int hashCode() {

       return field.hashCode() + text.hashCode();

    }

 

    public int compareTo(Object other) {

       return compareTo((Term) other);

    }

 

    public final int compareTo(Term other) {

       if (field == other.field) // fields are interned

           return text.compareTo(other.text);

       else

           return field.compareTo(other.field);

    }

 

    /** Resets the field and text of a Term. */

    final void set(String fld, String txt) {

       field = fld;

       text = txt;

    }

 

    public final String toString() {

       return field + ":" + text;

    }

 

    private void readObject(java.io.ObjectInputStream in)

           throws java.io.IOException, ClassNotFoundException {

       in.defaultReadObject();

       field = field.intern();

    }

}

    Term表示文本中的一个词,它是搜索的一个单位,它由两部分组成,词的文本,和它所出现的field的名字。注意,terms的意义不止是文本field中的words,它可以是日期,email地址,url等。

 

 

  评论这张
 
阅读(1377)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017