`

lucene入门到项目开发

 
阅读更多
加入jar包  lucene-core-2.4.0.jar  je-analysis-1.4.0.jar   lucene-highlighter-2.4.1.jar  lucene-analyzers-2.4.1.jar

先准备下工具类

Java代码 
package com.cs.lucene.utils; 
 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.InputStreamReader; 
 
import org.apache.lucene.document.Document; 
import org.apache.lucene.document.Field; 
import org.apache.lucene.document.NumberTools; 
import org.apache.lucene.document.Field.Index; 
import org.apache.lucene.document.Field.Store; 
 
public class File2DocumentUtiles { 
 
    /**
     *文件到document的转换
     * @param filepath
     * @return
     */ 
    public static Document file2Document(String filepath) { 
         
        File file = new File(filepath) ; 
         
        Document doc = new Document(); 
        doc.add(new Field("name",file.getName(),Store.YES,Index.ANALYZED)) ; //索引并分词 
        doc.add(new Field("content",readFileContent(file),Store.YES,Index.ANALYZED)) ; //索引并分词 
        doc.add(new Field("size",NumberTools.longToString(file.length()),Store.YES,Index.NOT_ANALYZED)) ; //索引不分词 
        doc.add(new Field("path",file.getPath(),Store.YES,Index.NO)) ; //不索引 
         
        return doc; 
    } 
/**
* 根据文件读取文件内容
* @param file
* @return
*/ 
    private static String readFileContent(File file) { 
         
        try { 
            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file))); 
            StringBuffer content = new StringBuffer(); 
             
            for(String line=null; (line = reader.readLine())!=null ;){ 
                content.append(line).append("\n") ; 
            } 
            return content.toString() ; 
        } catch (Exception e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } 
        return null; 
    } 
     
    public static void printDocInfo(Document doc){ 
        System.out.println("--------------------------"); 
        System.out.println("name          =" + doc.get("name")); 
        System.out.println("content       =" + doc.get("content")); 
        System.out.println("size          =" + NumberTools.stringToLong(doc.get("size"))); 
        System.out.println("path          =" + doc.get("path")); 
    } 
     
 



先了解下分词器
Java代码 
package com.cs.lucene.analyzer; 
 
import java.io.StringReader; 
 
import jeasy.analysis.MMAnalyzer; 
 
import org.apache.lucene.analysis.Analyzer; 
import org.apache.lucene.analysis.Token; 
import org.apache.lucene.analysis.TokenStream; 
import org.junit.Test; 
 
public class AnalyzerTest { 
      String text = "资源来自互联网吴朝辉wwwa的a-b放到" ; 
      Analyzer analyzer = new MMAnalyzer() ; 
       
      @Test 
      public void testAnalyze() throws Exception{ 
          analyze(analyzer,text); 
      } 
 
    private void analyze(Analyzer analyzer2, String text2) throws Exception { 
        System.out.println("----------分词器-------------------"); 
        TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(text)) ; 
        for(Token token = new Token();(token = tokenStream.next(token))!=null;){ 
            System.out.println(token); 
        } 
    } 
       
       



现在看看FSDirectory和RAMDirectory
Java代码 
package com.cs.lucene.directory; 
 
import jeasy.analysis.MMAnalyzer; 
 
import org.apache.lucene.analysis.Analyzer; 
import org.apache.lucene.document.Document; 
import org.apache.lucene.index.IndexWriter; 
import org.apache.lucene.index.IndexWriter.MaxFieldLength; 
import org.apache.lucene.store.Directory; 
import org.apache.lucene.store.FSDirectory; 
import org.apache.lucene.store.RAMDirectory; 
import org.junit.Test; 
 
import com.cs.lucene.utils.File2DocumentUtiles; 
 
public class DirectoryTest { 
    //创建索引用的文件路径 
    String filePath = "E:\\EclipseStudyWorkspace\\LucenceTest\\lucenceDataSource\\资源来自互联网,版权归原创作者或原单位公司所有.txt"; 
    //存放索引的目录 
    String indexPath = "E:\\EclipseStudyWorkspace\\LucenceTest\\lucenceIndex" ; 
     //分词器 
    Analyzer analyzer = new MMAnalyzer(); //je分词器 
     
     
    /**
     * 利用FSDirectory 创建索引
     * FSDirectory:在文件系统上存放
     * @throws Exception
     */ 
    @Test 
    public void testFSDirectory() throws Exception{  
          //测试文件系统目录   
          Directory dir =  FSDirectory.getDirectory(indexPath) ; 
          Document doc = File2DocumentUtiles.file2Document(filePath); 
           //参数true表示是否删除原来的索引后再重新创建,MaxFieldLength.LIMITED:表示只对前10000个字做索引 
           IndexWriter indexWriter = new IndexWriter(dir,analyzer,MaxFieldLength.LIMITED) ; //没有参数true,添加索引 
           indexWriter.addDocument(doc) ; 
            
           indexWriter.close() ; 
    } 
    /**
     * 利用RAMDirectory 创建索引
     * RAMDirectory:在内存中存放
     * 优点:读取快
     * 缺点:重新开机,索引没了
     * @throws Exception
     */ 
    @Test 
    public void testRAMDirectory() throws Exception{ 
          //测试文件系统目录 
          Directory dir =  new RAMDirectory() ; 
          Document doc = File2DocumentUtiles.file2Document(filePath); 
           //参数true表示是否删除原来的索引后再重新创建,MaxFieldLength.LIMITED:表示只对前10000个字做索引 
           IndexWriter indexWriter = new IndexWriter(dir,analyzer,MaxFieldLength.LIMITED) ; //没有参数true,添加索引 
           indexWriter.addDocument(doc) ; 
            
           indexWriter.close() ; 
    } 
    /**
     * 实际应用中,FSDirectory和RAMDirectory联合起来用
     * 操控内存的索引要快,所以在运行时操作RAMDirectory,
     * 但退出时必须保存到到文件系统上,所以退出时操控FSDirectory
     * @throws Exception
     */ 
    @Test 
    public void testRAMDirectoryAndFSDirectory() throws Exception{ 
        //整个过程:从文件系统上读取所以到内存,运行时添加索引,此时的全部索引都在内存中, 
        //退出时再把全部保存到文件系统上 
         
        Directory fsDir = FSDirectory.getDirectory(indexPath) ; 
         //1.启动时读取 
         Directory ramDir = new RAMDirectory(fsDir) ; 
         //运行时操作ramDir 
         IndexWriter ramIndexWriter = new IndexWriter(ramDir,analyzer,MaxFieldLength.LIMITED); 
         //添加document 
         Document doc = File2DocumentUtiles.file2Document(filePath) ; 
         ramIndexWriter.addDocument(doc) ; 
         ramIndexWriter.close() ;//一定要关闭再合并,因为有缓存 
          
         //2.退出时保存 
         //参数true表示把以前的索引删掉,全部重写 (默认为false) 
         IndexWriter fsIndexWriter = new IndexWriter(fsDir,analyzer,true,MaxFieldLength.LIMITED); 
         //new Directory[]{ramDir}:要合并的目录 
         //addIndexesNoOptimize:表示不做优化,做优化检索时相对要慢,但占用的存储空间小 
         fsIndexWriter.addIndexesNoOptimize(new Directory[]{ramDir}) ; 
         fsIndexWriter.flush() ; //优化之前一定要先刷新缓存 
         fsIndexWriter.optimize() ; //优化一定要在关闭之前做,优化可以提高检索的速度 
         fsIndexWriter.close() ; 
    } 
    @Test 
    public void testOptimize() throws Exception{ 
         
        Directory fsDir = FSDirectory.getDirectory(indexPath) ; 
        IndexWriter fsIndexWriter = new IndexWriter(fsDir,analyzer,MaxFieldLength.LIMITED); 
     
        fsIndexWriter.optimize() ;  
        fsIndexWriter.close() ; 
    } 



现在来测测索引如何建立以及搜索
Java代码 
package com.cs.lucene.lucene; 
 
import java.io.File; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
 
import jeasy.analysis.MMAnalyzer; 
 
import org.apache.lucene.analysis.Analyzer; 
import org.apache.lucene.document.Document; 
import org.apache.lucene.index.IndexWriter; 
import org.apache.lucene.index.IndexWriter.MaxFieldLength; 
import org.apache.lucene.queryParser.MultiFieldQueryParser; 
import org.apache.lucene.queryParser.QueryParser; 
import org.apache.lucene.search.Filter; 
import org.apache.lucene.search.IndexSearcher; 
import org.apache.lucene.search.Query; 
import org.apache.lucene.search.ScoreDoc; 
import org.apache.lucene.search.Sort; 
import org.apache.lucene.search.SortField; 
import org.apache.lucene.search.TopDocs; 
import org.apache.lucene.search.highlight.Formatter; 
import org.apache.lucene.search.highlight.Fragmenter; 
import org.apache.lucene.search.highlight.Highlighter; 
import org.apache.lucene.search.highlight.QueryScorer; 
import org.apache.lucene.search.highlight.Scorer; 
import org.apache.lucene.search.highlight.SimpleFragmenter; 
import org.apache.lucene.search.highlight.SimpleHTMLFormatter; 
 
import com.cs.lucene.utils.File2DocumentUtiles; 
 
public class IndexDao { 
    // 存放索引的目录 
    private String indexPath; 
    private Analyzer analyzer = null; // 分词器 
 
    public IndexDao() { 
        this.indexPath = "E:\\EclipseStudyWorkspace\\LucenceTest\\lucenceIndex"; 
        this.analyzer = new MMAnalyzer(); // je分词器对中文支持很好 
 
    } 
 
    public IndexDao(Analyzer analyzer, String indexPath) { 
        this.analyzer = analyzer; 
        this.indexPath = indexPath; 
    } 
 
    /**
     * 接受一个QuerString字符串 搜索索引并返回结果
     * 
     */ 
    public QueryResult search(String queryString, int firstResult, 
            int maxResults) throws Exception { 
        // 1.把要搜索的fields解析为Query 
        String[] fields = { "name", "content" }; 
        // boosts:需要的理由,标题和内容中出现关键字的得分不一样,在标题中出现时的得分理应高些 
        Map<String, Float> boosts = new HashMap<String, Float>(); 
        boosts.put("name", 3.0f); 
        boosts.put("content", 1.0f); // 默认值 
 
        QueryParser queryParser = new MultiFieldQueryParser(fields, analyzer, 
                boosts);// 多field搜索 
        Query query = queryParser.parse(queryString); 
 
        return search(query, firstResult, maxResults); 
    } 
 
    /*
     * 接受一个Query对象 搜索索引并返回结果
     */ 
    public QueryResult search(Query query, int firstResult, int maxResults) 
            throws Exception { 
        IndexSearcher indexSearcher = null; 
        // 2.进行查询 
        indexSearcher = new IndexSearcher(indexPath); 
        Filter filter = null; // 搜索时的过滤器 
        /** ********过滤器************* */ 
        // 过滤器:把结果再过滤一遍,效率会很低 
        // filter = new 
        // RangeFilter("size",NumberTools.longToString(200),NumberTools.longToString(500),true,true); 
        /** ************************* */ 
        Sort sort = new Sort(); 
        // 默认是按升序排序,参数true:排序结果改为按降序排列 
        sort.setSort(new SortField[] { new SortField("size", true) }); 
        TopDocs topDocs = indexSearcher.search(query, filter, 10000, sort); 
 
        int recordCount = topDocs.totalHits; 
 
        /** ***********准备高亮器******************** */ 
        Formatter formatter = new SimpleHTMLFormatter("<font color='red'>", 
                "</font>"); 
        Scorer scorer = new QueryScorer(query); 
        Highlighter highlighter = new Highlighter(formatter, scorer); 
 
        // 50表示只显示50个字符 这里的50个字符是有关键字的左右部分(称之为最佳部分) 这里只是测试用 
        Fragmenter fragmenter = new SimpleFragmenter(500); 
        highlighter.setTextFragmenter(fragmenter); 
        /** ************************************ */ 
         
        // 3.取出当前的数据 
        List<Document> recordList = new ArrayList<Document>(); 
        int end = Math.min(firstResult + maxResults, recordCount); 
        for (int i = firstResult; i < end; i++) { 
            ScoreDoc scoreDoc = topDocs.scoreDocs[i]; 
 
            int docSn = scoreDoc.doc; 
            Document doc = indexSearcher.doc(docSn); 
 
            // 使用高亮器 
            String hc = highlighter.getBestFragment(analyzer, "content", doc 
                    .get("content")); 
 
            // 如果content中没有搜索的关键字,则截取content的前200个字符 
            if (hc == null) { 
                String content = doc.get("content"); 
                int endIndex = Math.min(200, content.length()); 
                hc = content.substring(0, endIndex); 
            } 
            doc.getField("content").setValue(hc); 
 
            recordList.add(doc); 
        } 
        // 打开结果 
        /*
         * for(ScoreDoc scoreDoc :topDocs.scoreDocs){ int docSn = scoreDoc.doc ;
         * //文档内部编号 Document doc = indexSearcher.doc(docSn); //根据编号查找相应的文档
         * File2DocumentUtiles.printDocInfo(doc) ; }
         */ 
        // 4.返回结果 
        return new QueryResult(recordCount, recordList); 
    } 
 
    /*
     * 建立索引并保存
     */ 
    public void save(String filePath) throws Exception { 
        Document doc = File2DocumentUtiles.file2Document(filePath); 
        // 在添加doc的时候,可以设定文档的分数,不过不建议这样做 
        // doc.setBoost(1.0f); //默认值 
 
        // 参数true表示是否删除原来的索引后再重新创建,MaxFieldLength.LIMITED:表示只对前10000个字做索引 
        IndexWriter indexWriter = new IndexWriter(indexPath, analyzer, false, 
                MaxFieldLength.LIMITED); 
        indexWriter.addDocument(doc); 
        indexWriter.commit(); 
        indexWriter.optimize(); 
        indexWriter.close(); 
 
    } 
     
    public void save(File file) throws Exception { 
        save(file.getAbsolutePath()) ; 
    } 
 
    /*
     * 建立索引并保存 可以直接传入的是目录
     */ 
    public void saveDirectory(File file) throws Exception { 
        if (file.isFile()) { // 如果是文件就建索引并保存 
            save(file.getAbsolutePath()); 
            return; 
        } 
        File[] childs = file.listFiles(); 
        for (int i = 0; i < childs.length; i++) { 
            File f = childs[i]; 
            if (f.isDirectory()) {// 如果是目录就递归调用 
                saveDirectory(f); 
            } else { 
                save(f.getAbsolutePath()); 
            } 
        } 
    } 
 
    /**
     * 测试递归
     */ 
    public void save(File file, int pointer) throws Exception { 
        StringBuffer str = new StringBuffer(); 
        for (int i = 0; i < pointer; i++) { 
            str.append("--"); 
        } 
        if (file.isFile()) { // 如果是文件就建索引并保存 
            System.out.println(str + file.getName()); 
            return; 
        } 
        File[] childs = file.listFiles(); 
        for (int i = 0; i < childs.length; i++) { 
            File f = childs[i]; 
            if (f.isDirectory()) {// 如果是目录就递归调用 
                System.out.println(str + f.getName()); 
                save(f, pointer + 1); 
            } else { 
                System.out.println(str + f.getName()); 
            } 
 
        } 
    } 



Java代码 
package com.cs.lucene.lucene; 
 
import java.util.ArrayList; 
import java.util.List; 
 
import org.apache.lucene.document.Document; 
 
public class QueryResult { 
    private int recordCount = 0; 
    private List<Document> recordResults = new ArrayList<Document>(); 
 
    public QueryResult(int recordCount, List<Document> recordResults) { 
        this.recordCount = recordCount; 
        this.recordResults = recordResults; 
    } 
 
    public int getRecordCount() { 
        return recordCount; 
    } 
 
    public void setRecordCount(int recordCount) { 
        this.recordCount = recordCount; 
    } 
 
    public List<Document> getRecordResults() { 
        return recordResults; 
    } 
 
    public void setRecordResults(List<Document> recordResults) { 
        this.recordResults = recordResults; 
    } 
 




测试索引
Java代码 
package com.cs.lucene.lucene; 
 
import java.io.File; 
 
import jeasy.analysis.MMAnalyzer; 
 
import org.apache.lucene.analysis.Analyzer; 
import org.apache.lucene.document.Document; 
import org.junit.Test; 
 
import com.cs.lucene.utils.File2DocumentUtiles; 
 
public class IndexDaoTest { 
 
 
    private IndexDao indexDao = new IndexDao() ; 
     
    /*
     *搜索索引库,并返回结果
     */ 
    @Test 
    public void testSearch() throws Exception{ 
        String queryString = "www*" ; 
        QueryResult queryResults = indexDao.search(queryString ,0, 10) ; 
         //测试结果 
         System.out.println("总共有【"+queryResults.getRecordCount()+"】条匹配结果"); 
          
          for(int i =0 ; i<queryResults.getRecordResults().size();i++){ 
              Document doc = queryResults.getRecordResults().get(i) ; 
              File2DocumentUtiles.printDocInfo(doc) ; 
          } 
    } 
    /*
     * 测试索引源文件并保存到索引库
     */ 
    @Test 
    public void testSave() throws Exception{ 
        String filePath2 = "E:\\EclipseStudyWorkspace\\LucenceTest\\lucenceDataSource\\readme2.txt"; 
        //源文件 
        //String filePath = "E:\\EclipseStudyWorkspace\\LucenceTest\\lucenceDataSource\\资源来自互联网,版权归原创作者或原单位公司所有吴朝辉.txt"; 
         
          indexDao.save(filePath2); 
    } 
    /**
     * 用来给目录建索引并保存到索引库
     */ 
    @Test 
    public  void  testSaveDir() throws Exception{ 
        String filepath = "E:\\EclipseStudyWorkspace\\LucenceTest\\lucenceDataSource\\www" ; 
        File file = new File(filepath) ; 
        indexDao.saveDirectory(file); 
    } 



最后我们来看看lucene的查询功能
Java代码 
package com.cs.lucene.query; 
 
import java.util.Date; 
 
import org.apache.lucene.document.DateTools; 
import org.apache.lucene.document.Document; 
import org.apache.lucene.document.NumberTools; 
import org.apache.lucene.document.DateTools.Resolution; 
import org.apache.lucene.index.Term; 
import org.apache.lucene.search.BooleanQuery; 
import org.apache.lucene.search.PhraseQuery; 
import org.apache.lucene.search.Query; 
import org.apache.lucene.search.RangeQuery; 
import org.apache.lucene.search.TermQuery; 
import org.apache.lucene.search.WildcardQuery; 
import org.apache.lucene.search.BooleanClause.Occur; 
import org.junit.Test; 
 
import com.cs.lucene.lucene.IndexDao; 
import com.cs.lucene.lucene.QueryResult; 
import com.cs.lucene.utils.File2DocumentUtiles; 
 
public class QueryTest { 
     
    IndexDao indexDao = new IndexDao() ; 
     
    /*
     * 关键词查询
     */ 
    @Test 
    public void testTermQuery() throws Exception{ 
        Term term = new Term("name","资源"); 
        Query query = new TermQuery(term); 
     
        //查询打印结果 
         QueryAndPrintResult(query) ; 
    } 
    /*
     * 范围索引
     * 数字在query中都是字符串,所以要借助NumberTools工具类做转换
     */ 
    @Test 
    public void testRangeQuery() throws Exception{ 
        Term lowerTerm = new Term("size",NumberTools.longToString(200)); 
        Term upperTerm = new Term("size",NumberTools.longToString(500)); 
        //true表示是否包含边界 
        Query query = new RangeQuery(lowerTerm,upperTerm,true) ; 
         
        /*
        Term lowerTerm2 = new Term("size","200");
        Term upperTerm2 = new Term("size","500");
        Query query = new RangeQuery(lowerTerm2,upperTerm2,true) ; //true表示是否包含边界
    */ 
        //查询打印结果 
         QueryAndPrintResult(query) ; 
    } 
     
    /*
     * 测试NumberTools和DateTools
     */ 
    @Test 
    public void testNumberToolsAndDateTools() throws Exception{ 
         
    System.out.println("数字测试:");     
         System.out.println(NumberTools.longToString(200)); 
         System.out.println(NumberTools.longToString(500)); 
         System.out.println(NumberTools.stringToLong("000000000000dw")); 
         
    System.out.println("日期测试:");     
         System.out.println(DateTools.dateToString(new Date(), Resolution.SECOND)); 
         System.out.println(DateTools.dateToString(new Date(), Resolution.DAY)); 
         System.out.println(DateTools.stringToDate("20101005080855")); 
    } 
     
    /*
     * 通配符查询
     * ?:代表一个字符,*:代表0个或多个字符
     */ 
    @Test 
    public void testWildcardQuery() throws Exception{ 
        Term term = new Term("name","*me"); 
        Query query = new WildcardQuery(term) ;  
     
        //查询打印结果 
         QueryAndPrintResult(query) ; 
    } 
    /*
     * 短语查询:查询包含多个短语的query
     */ 
    @Test 
    public void testPhraseQuery() throws Exception{ 
        PhraseQuery phraseQuery = new PhraseQuery() ;  
        phraseQuery.add(new Term("name","资源")) ; 
        phraseQuery.add(new Term("name","作者")) ; 
         
        //setSlop:用来设置两个短语之间的最多可以隔多少个字符 
        phraseQuery.setSlop(20); 
     
        //查询打印结果 
         QueryAndPrintResult(phraseQuery) ; 
    } 
    /**
     * 布尔查询:非常重要
     * 三种关系:
     * 1.MUST和MUST:取得两个查询子句的交集。
     * 2.MUST和MUST_NOT:包含MUST但并且查询结果中不包含MUST_NOT的检索结果。
     * 3.SHOULT和SHOULT:表示"或"关系,最终检索结果为所有检索子句的并集。
     * 注意:有些组合是没有意义的
     * @throws Exception
     */ 
    @Test 
    public void testBooleanQuery() throws Exception{ 
        //条件1 
        PhraseQuery phraseQuery = new PhraseQuery() ;  
        phraseQuery.add(new Term("name","资源")) ; 
        phraseQuery.add(new Term("name","作者")) ; 
        phraseQuery.setSlop(20); 
         
        //条件2 
        Term lowerTerm2 = new Term("size","200"); 
        Term upperTerm2 = new Term("size","500"); 
        Query rangeQuery = new RangeQuery(lowerTerm2,upperTerm2,true) ; //true表示是否包含边界 
     
        //合并两个查询 
        BooleanQuery booleanQuery = new BooleanQuery() ; 
        booleanQuery.add(phraseQuery, Occur.MUST) ; 
        booleanQuery.add(rangeQuery,Occur.MUST) ; 
     
        //查询打印结果 
        QueryAndPrintResult(booleanQuery) ; 
    } 
     
     
     
    private void QueryAndPrintResult(Query query) throws Exception{ 
         
        System.out.println("相对应的查询字符串:"+query); 
          QueryResult qr = indexDao.search(query, 0, 100) ; 
         System.out.println("总共有【"+qr.getRecordCount()+"】条匹配结果"); 
         
        //打印结果 
          for(int i =0 ; i<qr.getRecordResults().size();i++){ 
              Document doc = qr.getRecordResults().get(i) ; 
              File2DocumentUtiles.printDocInfo(doc) ; 
          } 
    } 
分享到:
评论

相关推荐

    lucene入门到项目开发.docx

    lucene入门到项目开发.docx lucene入门到项目开发.docx

    lucene学习

    Lucene的基础知识 1、案例分析:什么是全文检索,如何实现全文检索 2、Lucene实现全文检索的流程 a) 创建索引 b) 查询索引 3、配置开发环境 ...Lucene的高级查询、solr入门 solr在项目中的应用及电商搜索实现

    深入理解Luncen搜索引擎开发

    Lucene是用java实现的、成熟的开源项目,是著名的Apache Jakarta大家庭的一员,并且基于Apache软件许可 [ASF, License]。同样,Lucene是当前非常流行的、免费的Java信息搜索(IR)库。 适合对象:掌握JAVA基础 ...

    SSM积分系统和商品检索系统(Spring+SpringMVC+MyBatis+Lucene+Redis+MAVEN).zip

    SSM框架学习宝典:入门、进阶、精通,全方位代码项目资 一、探索SSM的无限可能 SSM(Spring + Spring MVC + MyBatis)框架作为Java开发中的黄金组合,为开发者提供了强大的技术支持和丰富的功能。本系列资料将带您...

    大数据基础知识入门.pdf

    2005年,Hadoop作为Lucene的子项目Nutch 的一部分正式引入Apache基金会。2006年2 月被分离出来,成为一套完整独立的软件, 起名为Hadoop。 Hadoop的起源 总结起来,Hadoop起源于Google的三大论文 GFS—-&gt;HDFS ...

    Hadoop源码的入门解析

    Hadoop原来是Apache Lucene下的一个子项目,它最初是从Nutch项目中分离出来的专门负责分布式存储以及分布式运算的项目。简单地说来,Hadoop是一个可以更容易开发和运行处理大规模数据的软件平台。下面列举hadoop主要...

    JAVA上百实例源码以及开源项目源代码

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    史上最好传智播客就业班.net培训教程60G 不下会后悔

    ASP.Net MVC是微软推出的区别于ASP.Net WebForm的Web开发新技术,由于ASP.Net MVC解决了ASP.Net WebForm的很多缺点,非常适合大型、中型项目的开发,一经推出就受到了.Net开发社区的追捧,很多.Net开发人员的职位...

    Solr教学视频从入门到精通视频课程

    本课程适合有Lucene基础的同学学习1、Solr 是Apache下一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器2、Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能...

    JAVA上百实例源码以及开源项目

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    solr教程从入门到精通(solr5搜索引擎)

    Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。

    Eclipse开发分布式商城系统+完整视频代码及文档

    │ 14_搜索服务切换到集群版.wmv │ 15.课后作业-索引库商品同步.avi │ 15_商品同步作业.wmv │ 打开必读.txt │ 淘淘商城第八天笔记.docx │ ├─09.第九天 │ 01.第八天内容回顾.avi │ 02.课程计划.avi │ 03....

    java开源包1

    AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是...

    java开源包11

    AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是...

    java开源包2

    AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是...

    java开源包3

    AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是...

    java开源包6

    AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是...

    java开源包5

    AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是...

    java开源包10

    AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是...

Global site tag (gtag.js) - Google Analytics