LUCENE入门(一)


LUCENE(一)

介绍

什么是LUCENE

lucene是一个基于Java的全文检索工具包

数据分类

  • 结构化数据

    • 长度 格式 类型 固定
    • sql
  • 非结构化数据

    • word pdf html txt
    • 查询方法
      • (1)顺序扫描法(Serial Scanning)
        所谓顺序扫描,比如要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件。如利用windows的搜索也可以搜索文件内容,只是相当的慢。
      • (2)全文检索(Full-text Search)
        将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引。
        例如:字典。字典的拼音表和部首检字表就相当于字典的索引,对每一个字的解释是非结构化的,如果字典没有音节表和部首检字表,在茫茫辞海中找一个字只能顺序扫描。然而字的某些信息可以提取出来进行结构化处理,比如读音,就比较结构化,分声母和韵母,分别只有几种可以一一列举,于是将读音拿出来按一定的顺序排列,每一项读音都指向此字的详细解释的页数。我们搜索时按结构化的拼音搜到读音,然后按其指向的页数,便可找到我们的非结构化数据——也即对字的解释。
        这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。
        虽然创建索引的过程也是非常耗时的,但是索引一旦创建就可以多次使用,全文检索主要处理的是查询,所以耗时间创建索引是值得的。

什么是全文检索?

先创建索引再查询索引的过程就是全文检索

应用

只要有搜索的地方就可以用全文检索

  • 搜索引擎
  • 站内搜索

LUCENE全文检索

![屏幕快照 2020-01-03 15.20.21](LUCENE入门(一)/屏幕快照 2020-01-03 15.20.21.png)

  1. 创建索引

    1. 获得文档

    2. 构建文档对象

      ![屏幕快照 2020-01-03 15.21.14](LUCENE入门(一)/屏幕快照 2020-01-03 15.21.14.png)

    3. 分析文档

    4. 创建索引

      1. 倒排索引:倒排索引结构是根据内容(词语)找文档,倒排索引结构也叫反向索引结构,包括索引和文档两部分,索引即词汇表,它的规模较小,而文档集合较大。
  2. 查询索引

    1. 用户查询接口
    2. 将关键词封装成一个对象
    3. 执行查询
    4. 渲染结果

程序实战

导入包

  • lucene-analyzers-common-7.4.0.jar
  • lucene-core-7.4.0.jar
  • commons-io-2.6.jar

创建索引

//1.创建Director对象,保存索引库位置
    Directory directory = FSDirectory.open(new File("/Users/index_sth").toPath());
    //2.基于directory创建一个Indexwriter对象
    IndexWriter indexWriter = new IndexWriter(directory, new IndexWriterConfig());
    //3.读取磁盘文件创建索引
    File dir = new File("/Users");
    File[] files = dir.listFiles();
    for (File f : files) {
        //取文件名
        String fileName = f.getName();

        //参数1:域的名称,参数2:域的内容,参数3:是否存储
        Field fieldName = new TextField("name", fileName, Field.Store.YES);
      
        //4.创建Document
        Document document = new Document();
        document.add(fieldName);

        //5.将文档对象写入索引库
        indexWriter.addDocument(document);

    }
    //6.关闭indexWriter
    indexWriter.close();

查询索引

//1、创建一个Director对象,指定索引库的位置
Directory directory = FSDirectory.open(new File("/Users/index_sth").toPath());
//2、创建一个IndexReader对象
IndexReader indexReader = DirectoryReader.open(directory);
//3、创建一个IndexSearcher对象,构造方法中的参数indexReader对象。
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
//4、创建一个Query对象,TermQuery
Query query = new TermQuery(new Term("content", "spring"));
//5、执行查询,得到一个TopDocs对象
//参数1:查询对象 参数2:查询结果返回的最大记录数
TopDocs topDocs = indexSearcher.search(query, 10);
//6、取查询结果的总记录数
System.out.println("查询总记录数:" + topDocs.totalHits);
//7、取文档列表
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
//8、打印文档中的内容
for (ScoreDoc doc :
        scoreDocs) {
    //取文档id
    int docId = doc.doc;
    //根据id取文档对象
    Document document = indexSearcher.doc(docId);
    System.out.println(document.get("name"));
}
//9、关闭IndexReader对象
indexReader.close();
    

文章作者: Bxan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Bxan !
  目录