• Lucene 学习之一:源码环境搭建


    一直想抽点时间系统的学习下Lucene ,今天把Lucene 源码学习环境搭建了一下。下面描述一下环境搭建过程。

    开发环境的配置(lucene-4.10.2 + Eclipse):

    1:下载最新源码:把jar包lucene-4.10.2,和java源码lucene-4.10.2-src 都下载下来。

         下载地址:http://mirror.bit.edu.cn/apache/lucene/java/4.10.2/

    2:在Eclipse 安装lucene-4.10.2 java源码。

        新建JAVA 项目,把“使用缺省位置的勾去掉”。选择源码文件目录。

    项目加载进来后会有很多错误提示,这是因为还有很多依赖包没有引用到。

    解决办法,把jar包lucene-4.10.2 各文件夹下面的lib 文件下面的jar 包都拷贝出来。

    在项目中建一个lib 文件夹。把所以的jar 包复制过来。然后,把所以jar 包添加到构建路径。居然有这么多包。

    lucene-4.10.2-srclucene-4.10.2demosrcjavaorgapachelucenedemo 这个目录下有两个简单实例,分别是建索引 和 查询 。

    新建一个JAVA 项目,并在构建项目中添加lucene-4.10.2的引用。

    下面可以自己尝试写demo了。

    下面是一个建索引的例子:

    package index.demo;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.*;
    
    import org.apache.lucene.analysis.Analyzer;
    import org.apache.lucene.analysis.standard.StandardAnalyzer;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field;
    import org.apache.lucene.document.LongField;
    import org.apache.lucene.document.StringField;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.index.IndexWriterConfig;
    import org.apache.lucene.index.IndexWriterConfig.OpenMode;
    import org.apache.lucene.store.Directory;
    import org.apache.lucene.store.FSDirectory;
    import org.apache.lucene.util.Version;
    
    import index.bean.*;
    
    /**
     * @author zhangrh 索引构建类
     */
    public class IndexBuilder {
    
        private IndexBuilder() {
        }
    
        /**
         * 索引初始化
         */
        public static void initIndex() {
            try {
    
                String indexPath = "D://lucene/index";
    
                Directory dir = FSDirectory.open(new File(indexPath));
    
                Analyzer analyzer = new StandardAnalyzer();
    
                IndexWriterConfig iwc = new IndexWriterConfig(
                        Version.LUCENE_4_10_2, analyzer);
    
                iwc.setOpenMode(OpenMode.CREATE);
    
                IndexWriter writer = new IndexWriter(dir, iwc);
    
                ArrayList<Hotel> hotelList = getContentData();
    
                if (hotelList != null) {
    
                    for (Hotel h : hotelList) {
    
                        Document doc = new Document();
          
                        LongField idField = new LongField("id", h.getId(),
                                Field.Store.YES);
                        
                        doc.add(idField);
    
                        Field nameCNField = new StringField("name", h.getNameCN(),
                                Field.Store.YES);
                        
                        doc.add(nameCNField);
                        
                        Field nameENField = new StringField("ename", h.getNameEN(),
                                Field.Store.YES);
                        
                        doc.add(nameENField);
                        
                        writer.addDocument(doc);
                    }
    
                }
                
                writer.close();
    
            } catch (IOException e) {
    
                // TODO 自动生成的 catch 块
                e.printStackTrace();
    
            }
    
        }
    
        /**
         * 返回 {@link Hotel} 内容数据
         * 
         * @return An ArrayList of Hotel
         */
        private static ArrayList<Hotel> getContentData() {
    
            ArrayList<Hotel> list = new ArrayList<Hotel>();
            return list;
        }
    
    }

     查询例子

    package index.demo;
    
    import java.io.File;
    import java.io.IOException;
    
    import org.apache.lucene.document.Document;
    import org.apache.lucene.index.DirectoryReader;
    import org.apache.lucene.index.IndexReader;
    import org.apache.lucene.index.Term;
    import org.apache.lucene.search.IndexSearcher;
    import org.apache.lucene.search.Query;
    import org.apache.lucene.search.ScoreDoc;
    import org.apache.lucene.search.TermQuery;
    import org.apache.lucene.search.TopDocs;
    import org.apache.lucene.store.Directory;
    import org.apache.lucene.store.FSDirectory;
    
    /**
     * @author zhangrh 索引查找Demo
     *
     */
    public class SearchDemo {
        
        private SearchDemo(){
        }
        
        
        /**
         * 查询酒店
         */
        public static void SearchHotel(String hotelname) {
    
            try {
                String indexPath = "D://lucene/index";
                
                Directory dir = FSDirectory.open(new File(indexPath));
                
                IndexReader reader = DirectoryReader.open(dir);
                
                IndexSearcher searcher = new IndexSearcher(reader);
                
                Term term = new Term("name", hotelname);
                
                Query query = new TermQuery(term);
                // Do the search
                TopDocs docs = searcher.search(query, 10);
                
                System.out.println("查询结果总数:" + docs.totalHits);  
                
                for (ScoreDoc sd : docs.scoreDocs) {
                    
                    Document document= searcher.doc(sd.doc);
                    
                    System.out.println("酒店id:" + document.get("id"));  
                    
                    System.out.println("酒店name:" + document.get("name"));  
                }
                reader.close();
                
            } catch (IOException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
        }
    }
    View Code

    官方API说明:http://lucene.apache.org/core/4_10_2/index.html

  • 相关阅读:
    .net开源工作流ccflow从表数据数据源导入设置
    驰骋开源的asp.net工作流程引擎java工作流 2015 正文 驰骋工作流引擎ccflow6的功能列表
    app:clean classes Exception
    Android Couldn't load BaiduMapSDK
    android okvolley框架搭建
    compileDebugJavaWithJavac
    android重复的文件复制APK META-INF许可证错误记录
    android listview多视图嵌套多视图
    通讯录笔记
    面试总结
  • 原文地址:https://www.cnblogs.com/zrhai/p/4156067.html
Copyright © 2020-2023  润新知