lucene2.0中主要类的介绍



lucene2.0中主要类的说明。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的值的数组

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)   name参数:Field的名称。为Field添加值的具体方式3种:字符串,reader和二进制byte传入。   termVector属性是用语表明对Field的词条向量如何进行存储。      IndexWriter类  构造方法:3个   IndexWriter(String path,Analyzer a,boolean create)   IndexWriter(File f,Analyzer a,boolean create)   IndexWriter(Directory d,Analyzer a,boolean create)   第一个参数是要索引建立在哪个目录里           第二个参数是新建一个文本分析器,这里用的是标准的大家也可以自己写一个           第三个参数是否删除已有的索引  方法:public void addDocument(Document doc)    public void addDocument(Document doc,Analyzer analyzer)    public void setmaxFieldLength(int maxFieldLength)    IndexSearcher类  构造方法:IndexSearcher(String path)      IndexSearcher(Directory directory)    IndexSearcher(IndexReader r)   方法:seach(Query query)    seach(Query query,Sort sort)    void close()    int docFreq(Term term) throws IOException  -计算索引中包含有指定一个term信息的文档量    int[] docFreq(Term[] term) throws IOException -计算索引中有多少文档包含指定一组term信息    int maxDoc() throws IOException 返回索引中最大可能具有的Document的数量(再加1)    Document doc(int i) throws IOException 取出索引中ID号为i的文档    Query rewrite(Query query) throws IOException  对查询进行rewrite,使之成为原子查询  Query类:表示一个查找请求 Hits:表示查找结果。  方法:public final int length()    public fianl Document doc(int n) throws IOExcepiton 取得当前结果集中第N个Document    public fianl float score(int n) throws IOExcepiton  取得当前结果集中第N个Document的得分    public fianl int id(int n) throws IOExcepiton  取得当前结果集中第N个Document的索引内部ID值    public Iterator iterator()   取得对HITS集合 的遍历对象 Filter:表示对索引中文档集合的过滤器 Sort:对索引的结果进行排序的工具 Hitcollector:对检索结果进行选择的一个工具,并将选择后的结果保存在其中 Weight:就是‘权重’,表示一次查询时,索引中的某个文档的重要性 TermQuery词条搜索  public TermQuery(Term) BooleanQuery 布尔搜索 -就是一个由多个字句和字句的布尔逻辑所组成的查询。  例:Term t1 =new Term(“bookname”,”女”); Term t2 =new Term(“bookname”,”狗”);     TermQuery q1=new TermQuery(t1);    TermQuery q2=new TermQuery(t2);     BooleanQuery query=new BooleanQuery();     query.add(q1,BooleanClause.Occur.MUST);     query.add(q2,BooleanClause.Occur.MUST);

BooleanClause.Occur 类只要有3种表示:   BooleanClause.Occur.MUST、BooleanClause.Occur.MUST_NOT 和BooleanClause.Occur.SHOULD   RangeQuery 范围搜索  例:Term begin =new Term(“booknumber”,”0001″);Term end =new Term(“booknumber”,”0005″);   RangeQuery query=new RangeQuery(begin,end,false);    PrefixQuery 前缀搜索  例:Term prefix =new Term(“booknumber”,”刚”);   PrefixQuery query =new PrefixQuery(prefix); PhraseQuery 短语搜索  例: PhraseQuery query=new PhraseQuery();   query.add(new Term(“bookname”,”钢”));   query.add(new Term(“bookname”,”铁”));   query.setSlop(1); MultiPhraseQuery 多短语搜索  例:MultiPhraseQuery query=new MultiPhraseQuery();     query.add(new Term(“bookname”,”钢”));-前缀     Term t1 =new Term(“bookname”,”铁”);-后缀     Term t2 =new Term(“bookname”,”和”);-后缀     Term t3 =new Term(“bookname”,”要”);-后缀     query.add(new Term[]{t1,t2,t3})

FuzzyQuery 模糊搜索  构造方法:   public FuzzyQuery(Term term,flot minimumsimilarity) throws IllegalArgumentException   public FuzzyQuery(Term term,flot minimumsimilarity,int prefixLength) throws IllegalArgumentException   minimumsimilarity:相似度   prefixLength:前缀匹配个数  例:Term t=new Term(“content”,”work”);   FuzzyQuery query = new FuzzyQuery(t,0.1f,1);

WildcardQuery 通配符搜索  例:Term t=new Term(“content”,”?o*”);   WildcardQuery query=new WildcardQuery(t);    SpanQuery 跨度搜索,抽象类 ,有三个子类  SpanTermQuery 类 与TermQuery完全一样  SpanFirstQuery类   例:Term t=new Term(“content”,”mary”);      SpanTermQuery people =new SpanTermQuery(t);      SpanFirstQuery query=new SpanFirstQuery(people,3);数字为跨度几个数字  SpanNearQuery类   例: Term t1=new Term(“content”,”aa”);    Term t2=new Term(“content”,”cc”);    Term t3=new Term(“content”,”gg”);    Term t4=new Term(“content”,”kk”);    SpanTermQuery s1=new SpanTermQuery(t1);    SpanTermQuery s2=new SpanTermQuery(t2);    SpanTermQuery s3=new SpanTermQuery(t3);    SpanTermQuery s4=new SpanTermQuery(t4);    SpanNearQuery query1=new SpanNearQuery(new SpanQuery[]{s1,s2},1,flase);    SpanNearQuery query2=new SpanNearQuery(new SpanQuery[]{s3,s4},3,flase);    SpanNear Query=new SpanNearQuery(new SpanQuery[]{query1,query2},3,flase);    其中:数字为跨度的个数,boolean是表示词组中的每个词是否一定要按照顺序出现在文档中。  SpanOrQuery类:   例:Term t1=new Term(“content”,”aa”);    Term t2=new Term(“content”,”cc”);    Term t3=new Term(“content”,”gg”);    Term t4=new Term(“content”,”kk”);    SpanTermQuery s1=new SpanTermQuery(t1);    SpanTermQuery s2=new SpanTermQuery(t2);    SpanTermQuery s3=new SpanTermQuery(t3);    SpanTermQuery s4=new SpanTermQuery(t4);    SpanNearQuery query1=new SpanNearQuery(new SpanQuery[]{s1,s2},1,flase);    SpanNearQuery query2=new SpanNearQuery(new SpanQuery[]{s3,s4},3,flase);    SpanOrQuery query = new SpanOrQuery(new SpanQuery[]{query1,query2});  SpanNotQuery类:   例:Term t1=new Term(“content”,”aa”);    Term t2=new Term(“content”,”cc”);    Term t3=new Term(“content”,”gg”);    Term t4=new Term(“content”,”kk”);    SpanTermQuery s1=new SpanTermQuery(t1);    SpanTermQuery s2=new SpanTermQuery(t2);    SpanTermQuery s3=new SpanTermQuery(t3);    SpanTermQuery s4=new SpanTermQuery(t4);    SpanNearQuery query1=new SpanNearQuery(new SpanQuery[]{s1,s2},1,flase);    SpanNearQuery query2=new SpanNearQuery(new SpanQuery[]{s3,s4},3,flase);    SpanOrQuery query = new SpanOrQuery(new SpanQuery[]{query1,query2});     RegexQuery类:使用正则表达式  例:String regex=”http://[a-z]{1,3}//.abc//.com/.*”;     Term t=new Term(“url”,regex);     RegexQuery query=new RegexQuery(t);  注意:   1.需要将lucene解压包中contrib/regex/src/java/org/apache/regexp目录下的所有文件和     contrib/regex/src/java/org/apache/lucene/search/regex目录下的所有文件放入工程内   2.要使用第三放的包,就是jakata-regexp-x.jar,下载:http://jakarta.apache.org/site/downloads/downloads_regexp.cgi   QueryParser:转换用户关键字 ,不支持SpanQuery  构造方法:public QueryParser(Field field,Analyzer analyzer)  方法:public static query(String query)  默认为布尔逻辑    public void setdefaultOperator(QueryParser.AND_OPERATOR) 改变默认的逻辑  例:String field=”bookname”;     String queryStr = “java struts”;     QueryParser parser=new QueryParser(field,new StandardAnalyzer());     parser.setdefaultOperator(QueryParser.AND_OPERATOR)     Query q=parser.parse(queryStr);     System.out.println(q.toString());  特殊符号:”+”、”and”:表示并且 “or”:或者  “-”、”not”: 非 “~1″:坡度1 引号:不分词  “:”:指定Field  ”[.. to ..]“:范围搜索  通配符号:”*”、”?”  如果想让QueryParser不对期进行分词,需要在词组外面加上引号。例如:     String field=”bookname”;     String queryStr = “/”java struts/”";     QueryParser parser=new QueryParser(field,new StandardAnalyzer());     parser.setdefaultOperator(QueryParser.AND_OPERATOR)     Query q=parser.parse(queryStr);     System.out.println(q.toString());       MultiFieldQueryParser类:多域搜索  方法:public static Query parse(String[] queries,String[] fields,Analyzer analyzer) throws ParseException  –在不同的Field上进行不同的查找    public static Query parse(String query,String[] fields,BooleanClause.Occur[] flags,Analyzer analyzer) throws ParseException  –在不同的Field上进行同一查找,指定他们之间的布尔关系    public static Query parse(String[] queries,String[] fields,BooleanClause.Occur[] flags,Analyzer analyzer) throws ParseException  –在不同的Field上进行不同的查找,指定他们之间的布尔关系    MultiSearcher 在多个索引上搜索  构造方法:public MultiSearcher(IndexSearcher[] searchers)   相关度排序:  Searcher的explain方法:public Explanation explain(Query query,int doc) throws IOException   第一个参数:当前的Query对象,第二个参数:文档的内部ID号   方法的toString()方法能够将一个文档的得分情况详细地列举出来   例:Hits hits = searcher.search(query);    for(int i=0;i<hits.length();i++){     Document doc=hits.doc(i);     System.out.println(doc.get(“bookname”)):     System.out.println(hits.score(i));     System.out.println(searcher.explain(query,hits.id(i)).toString());    }   文档得分主要由4部分内容来决定:tf(词条频率)、idf(反转文档频率)、boost(Field的激励因子)和lengthNorm(长度因子)   通过改变boost值来改变文档的得分 :doc.setBoost(float f);  使用Sort来排序:Sort是Lucene自带的一个排序工具。   Sort类:seach(Query query,Sort sort)    6个构造方法:     public Sort()     public Sort(String field)  –直接使用Field的字符串名称     public Sort(String field,boolean reverse)  –第一个参数:Field的字符串名称,第二个参数:指定是升序还是降序 ,默认为false,降序     public Sort(String[] fields)  –多个Field的字符串数组     public Sort(SortField field)     public Sort(SortField[] fields)   SortField类:包装类,可以使Sort类清楚的了解要进行排序的Field的各种信息    构造方法:     public SortField(Stirng field)  —Field的字符串名称     public SortField(Stirng field,boolean reverse) –第一个参数:Field的字符串名称,第二个参数:指定是升序还是降序 ,默认为false,升序     public SortField(String field,Locale locale)   –第一个参数:Field的字符串名称,Locale信息     public SortField(Stirng field,int type) –第一个参数:Field的字符串名称,第二个参数:指定是升序还是降序,第三个参数:当前Field的值类型     public SortField(Stirng field,int type,boolean reverser)       标识Field类型:SortField.STRING、SortField.INT和SortField.FLOAT  按文档得分进行排序:例:Hits hits=searcher.searcher(query,Sort.RELEVANCE);  按文档的内部ID号来排序,例: Hits hits=searcher.searcher(query,Sort.INDEXORDER);  按一个或多个Field来排序   例:Sort sort = new Sort();   SortField sf1=new SortField(“publishdate”,SortField.STRING,true); 按发布日期降序   SortField sf2=new SortField(“booknumber”,SortField.STRING,false);  按书本号升序   sort.setSort(new SortField[]{sf1,sf2});   Hits hits = searcher.search(query,sort)   搜索的过滤器:  基类都是:org.apache.lucene.search.Filter,   有一个抽象方法:public abstract BitSet bits(IndexReader reader) throws IOException   seach(Query query,Fileter filter)   RangeFilter:范围过滤。   构造方法:RangeFilter(Stirng field,String begin,String end,boolean,boolean) –第一个参数:Field的字符串名称,第二和第三参数:范围,两个boolean参数边式边界是否需要被包含在这个范围内。