• Lucene


    Lucene的使用,简单来说可以划分为两种类型,一是建立索引,二是搜索内容。

    一、建立索引的五个基础类 Document, Field, IndexWriter, Analyzer, Directory 

    1、Document类:用来描述文档,这里的文档可以指一个HTML页面,一封电子邮件,或者是一个文本文件。一个 Document 对象由多个Field对象组成的。可以把一个Document对象想象成数据库中的一个记录,而每个Field对象就是记录的一个字段。

    2、Field类:用来描述一个文档的某个属性,比如一封电子邮件的标题和内容可以用两个Field对象分别描述。

    3、Analyzer类:用来对文档内容进行分词处理,Analyzer 类是一个抽象类,它有多个实现,针对不同的语言和应用需要选择适合的Analyzer,Analyzer会把分词后的内容交给IndexWriter来建立索引。

    4、IndexWriter类:用来创建索引的一个核心类,作用是把一个个的Document对象加到索引中来。

    5、Directory 类:表示索引文件存储位置的抽象类。有两个常用的子类:

        * FSDirectory — 在实际文件系统中存储索引的 Directory 实现。该类对于大型索引非常有用。
        * RAMDirectory — 在内存中存储所有索引的实现。该类适用于较小的索引,可以完整加载到内存中,在应用程序终止之后销毁。由于索引保存在内存中,所以速度相对较快。

     

    二、搜索内容的四个基础类:Searche、Term、Query和TopDocs    

    1、Searcher 是一个抽象基类,包含各种超负荷搜索方法。IndexSearcher 是一个常用的子类,允许在给定的目录中存储搜索索引。Search 方法返回一个根据计算分数排序的文档集合。Lucene 为每个匹配给定查询的文档计算分数。IndexSearcher 是线程安全的;一个实例可以供多个线程并发使用。

    2、Term 是搜索的基本单位。它由两部分组成:单词文本和出现该文本的字段的名称。Term 对象也涉及索引编制,但是可以在 Lucene 内部创建。

    3、Query 和子类

    Query 是一个用于查询的抽象基类。搜索指定单词或词组涉及到在项中包装它们,将项添加到查询对象,将查询对象传递到 IndexSearcher 的搜索方法。

    Lucene 包含各种类型的具体查询实现,比如 TermQuery、BooleanQuery、PhraseQuery、PrefixQuery、RangeQuery、 MultiTermQuery、FilteredQuery、SpanQuery 等。以下部分讨论 Lucene 查询 API 的主查询类。

    4、TopDocs    封装搜索结果以及 ScoreDoc 的总数

     
    一个最简单的Lucene例子,展示Lucene中重要的几个类IndexWriter、Directory、Analyzer、Document、Field、IndexSearcher、Term、Query、TermQuery、TopDocs的简单用法。


    package org.apache.lucene.demo;

    import java.io.IOException;

    import org.apache.lucene.analysis.SimpleAnalyzer;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.index.Term;
    import org.apache.lucene.search.IndexSearcher;
    import org.apache.lucene.search.Query;
    import org.apache.lucene.search.TermQuery;
    import org.apache.lucene.search.TopDocs;
    import org.apache.lucene.store.RAMDirectory;

    public class LuceneTest {

            public static void main(String[] args) throws IOException {
                RAMDirectory directory = new RAMDirectory();
                IndexWriter writer =
                  new IndexWriter(directory, new SimpleAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED);
                   
                Document doc = new Document();
                doc.add(new Field("partnum", "Q36", Field.Store.YES, Field.Index.NOT_ANALYZED));  
                doc.add(new Field("description", "Illidium Space Modulator", Field.Store.YES, Field.Index.ANALYZED));
                writer.addDocument(doc);
                writer.close();

                IndexSearcher searcher = new IndexSearcher(directory);
                Query query = new TermQuery(new Term("partnum", "Q36"));  
                TopDocs rs = searcher.search(query, null, 10);
                System.out.println(rs.totalHits);

                Document firstHit = searcher.doc(rs.scoreDocs[0].doc);
                System.out.println(firstHit.getField("partnum").name());
            }
    }

     

    更多>>  http://wiki.apache.org/lucene-java/HowTo

  • 相关阅读:
    SQL学习笔记六之MySQL数据备份和pymysql模块
    SQL学习笔记五之MySQL索引原理与慢查询优化
    SQL学习笔记四之MySQL数据操作
    SQL学习笔记四(补充-2)之MySQL多表查询
    SQL学习笔记四(补充-2-1)之MySQL SQL查询作业答案
    SQL学习笔记四(补充-1)之MySQL单表查询
    SQL学习笔记四(补充-1-1)之MySQL单表查询补充部分:SQL逻辑查询语句执行顺序
    Python Web学习笔记之为什么设计GIL
    SQL学习笔记三之MySQL表操作
    buffer小解
  • 原文地址:https://www.cnblogs.com/Sonet-life/p/3664923.html
Copyright © 2020-2023  润新知