Java Lucene(6):编写索引器之一

来源:互联网 发布:网络品牌营销策略研究 编辑:程序博客网 时间:2024/06/04 01:32

Java lucene 技术(6) : 编写索引器之一

从本章开始,我们将建立一个索引工具,它可以实现基本的中文分词功能和建立索引功能。首先,通过一个程序示例,说明为什么搜索引擎要采用索引的方式。

程序6-1向你展示了一个简单文本搜索算法:

public class TextSearch {

    private final static int maxNum_T = 255;

    private final static int maxNum_P = 255;

    private final char[] t = new char[maxNum_T];

    private final char[] p = new char[maxNum_P];

    private int tLength ;

    private int pLength ;

   

    public int text_search(){

       int i = 0;

       while(i+pLength<=tLength){

           int j = 0;

           while(t[i+j]==p[j]){

              j=j+1;

              if(j>=pLength)

                  return i;

           }

           i=i+1;

       }

       return -1;

    }

   

    public void getChar(String str_t,String str_p) throws IOException{

       StringReader sr_t = new StringReader(str_t);

       StringReader sr_p = new StringReader(str_p);

       tLength = sr_t.read(t);

       pLength = sr_p.read(p);

    }

   

    public static void main(String args[]) throws Exception{

       TextSearch ts = new TextSearch();

       String str_t = "010001";

       String str_p = "001";

       ts.getChar(str_t, str_p);

       System.out.println(ts.text_search());

    }

}

这是一个简单的文本搜索算法,在一个文本中定位一个单词的最简单办法是在文本中逐个地比较字符,测试文本中所有可能的位置,直到一个匹配被找到。我们可以发现,在最坏的情况下,没有p的匹配,算法的执行时间是O(pLength(tLength-pLength+1)),这种算法是低效率的,不适合大数据量的文本搜索,尤其是有重复字符的情况下。

索引提供了一种在一个较大的文档中查找某些词出现位置的方法。它涉及到‘词’和‘位置’,想实现索引,第一步先要从大数据量的文档里抽出词,第二步将某个词的位置信息作为属性赋给词。实现这两步后,索引的优点也就体现出来了:通过索引库,找到关键词,获取它的位置信息,然后再将相关信息取出。这种方式,就像是邮递员通过门牌号将邮件送递至指定位置,而不是挨家挨户的去找。

按照面向对象思想,我们将文本中的词作为一个对象,赋予对象相应的属性特征。

接下来,我们就开始建立索引的第一步:分词。因为将词作为我们操作的对象,所以先要建立这个对象

程序6-2实现了这个对象:

public class MyselfToken {

      private String termText;            

      private int startOffset;              

      private int endOffset;

     

  public MyselfToken(String text, int start, int end) {

        termText = text;

        startOffset = start;

        endOffset = end;

      }

     

    public int getEndOffset() {

       return endOffset;

    }

    public void setEndOffset(int endOffset) {

       this.endOffset = endOffset;

    }

    public int getStartOffset() {

       return startOffset;

    }

    public void setStartOffset(int startOffset) {

       this.startOffset = startOffset;

    }

    public String getTermText() {

       return termText;

    }

    public void setTermText(String termText) {

        this.termText = termText;

    }  

}

通过这个程序,我们实现了将位置信息startOffsetendOffset赋予对象MyselfToken。接下来,我们就要实现文本的分词功能了。

                                                                                                                    未完待续

                                                          

原创粉丝点击