美文网首页
Lucene的总体架构——基于Lucene7.0

Lucene的总体架构——基于Lucene7.0

作者: Mr韶先生 | 来源:发表于2017-11-07 15:08 被阅读222次
    前言:根据Lucene7.0版本介绍Lucene相关知识
    

    总体架构

    在Lucene in action中,Lucene 的构架和过程如下图,


    Lucene in action 中Lucene架构

    根据Lucene架构图,lucene主要包含两个过程,建立索引以及搜索索引。

    • 建立索引
      使用Lucene时,将被搜索的内容包括文件、数据库、web数据等数据源转换成lucene的Document对象,存入系统文件或内存中,建立索引。
    • 搜索索引
      当用户搜索时,将用户搜索内容封装成Query对象,并通过search函数搜索Lucene索引,如果命中关键词,则返回命中的TopDocs对象

    具体代码(Lucene7.0)

     public void buildIndex() {
            try {
                //索引建立过程
                //创建索引目录,RAMDirectory基于内存
                RAMDirectory directory = new RAMDirectory();
                //保存用于创建IndexWriter对象的所有配置;WhitespaceAnalyzer空白分词器,用于建立索引时的分词
                IndexWriterConfig config = new IndexWriterConfig(new WhitespaceAnalyzer());
                //创建IndexWriter用于建立索引
                IndexWriter indexWriter = new IndexWriter(directory, config);
                //Document索引的载体,每条索引信息对应一个document对象
                Document document = new Document();
                //Field对象相当于索引信息的某个属性,通过add()添加到document中,StringField的value作为一个整体,不能再被分词;第三个参数代表是否被存储
                document.add(new StringField("name", "seansherwood", Field.Store.YES));
                //TextField中的值需要被分词器分词
                document.add(new TextField("description", "like Android and Lucene", Field.Store.YES));
                //建立索引
                indexWriter.addDocument(document);
                //建立索引之后要将indexWriter对象commit方法,对于索引的增删改操作都需要进行commit;如果建立索引完成可以直接调用close,其默认调用了commit
                indexWriter.close();
                //搜索过程
                //IndexSearcher用于索引搜索,参数需要创建索引时的索引目录
                IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(directory));
                //封装搜索查询语句
                Query query = new TermQuery(new Term("description", "Lucene"));
                //搜索返回命中的document的ID对象
                TopDocs hit = searcher.search(query, 10);
                System.out.println(hit.scoreDocs.length);
                //遍历拿到索引中的document
                for (int i = 0; i < hit.scoreDocs.length; i++) {
                    Document doc = searcher.doc(hit.scoreDocs[i].doc);
                    System.out.println("name:" + doc.get("name"));
                    System.out.println("description:" + doc.get("description"));
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    

    注:能力一般,水平有限,如有不当之处,请批评指正,定当虚心接受!

    相关文章

      网友评论

          本文标题:Lucene的总体架构——基于Lucene7.0

          本文链接:https://www.haomeiwen.com/subject/ogrfcxtx.html