• Lucene系列-概述


    为了生存,就得干一行爱一行。那就学习下lucene吧。

    全文检索介绍

    流程:

    1. 建索引
      • 准备待搜索文档
      • 文档分词:将文档分成一个个单独的单词,去除标点符号、停词(无意义的冠词介词等),得到token
      • 语言处理:统一小写,单词缩减或转变为词根形式,得到term
      • 索引:用term创建字典,term->doc,对字典按字母顺序排序,合并相同的term成为文档倒排链表。term->doc1,doc2,doc3
    2. 搜索
      • 输入查询语句
      • 处理查询语句:词法分析、语法分析、语言处理,得到语法树
      • 搜索索引,得到符合语法树的文档
      • 根据文档和查询语句的相关性,进行结果排序

    计算文档间的相关性:

    文档有许多term组成,不同的term对文档的重要性不同。判断文档间的关系需要两步:

    • 计算各term对文档的权重

    • 计算文档和query间的相关性

    文档由一系列的词组成,可以用各词的权重组成的向量代表一个文档。Doc vector = {weight1, weight2, ..., weightN},query也看做是一个文档,query和doc的词数取并集,不含某词,则对应的权重为0。

    文档间的相关性转变为两个向量间的夹角大小,夹角越小,相关性越大。夹角越小,余弦越大,所以文档间的相关性如下计算:


    Lucene

    Lucene就是一个开源的全文检索库,java实现的,只支持纯文本文件的索引和搜索,不负责其由其他格式文件抽取文本或从网络抓取文件。它的工作流程和上述相似。


    代码实例

    //建索引
    Analyzer analyzer = new MaxWordAnalyzer();//词法分析器
    IndexWriter writer = new IndexWriter(new RAMDirectory(), analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED); //建索引主类
    Document doc = new Document();//待索引文档
    doc.add(new Field("id","1",Field.Store.YES,Field.Index.NOT_ANALYZED));//文档属性
    doc.add(new Field("name","zhangsan",Field.Store.YES,Field.Index.ANALYZED_NO_NORMS);
    writer.addDocument(doc);
    writer.commit();
    //搜索索引
    QueryParser parser = new QueryParser(Version.LUCENE_30, "name", analyzer);//语法分析器(词法、语法分析)
    Query q = parser.parse("zhangsan");//查询语句的语法分析获得语法树
    IndexSearcher searcher = new IndexSearcher(writer.getReader());//查询主类
    TopDocs docs = searcher.search(q,10);//搜索
    for (ScoreDoc scoreDoc : docs.scoreDocs) {
      //展示结果
      Document doc = searcher.doc(scoreDoc.doc);
      System.out.println(doc.get("id") + doc.get("name"));
    }
    

    Lucene包结构


    红线为建索引过程,蓝线为搜索过程。

    analysis:语言分析器,对需要建立索引的文本进行分词、过滤等操作,如Analyzer类

    index:索引管理,负责索引的创建、删除,如IndexWriter。索引包是整个系统核心,全文检索的根本就是为每个切出来的词建索引,查询时就只需要遍历索引,而不需要去正文中遍历,从而极大的提高检索效率。

    store:数据存储管理,主要包括一些底层的I/O操作,如Directory

    queryParser:查询分析器,生成语法树,实现查询关键词间的运算,如QueryParser

    search:对索引的搜索,根据查询条件,得到结果,如IndexSearcher

    similarity:对相关性打分模型的实现



  • 相关阅读:
    将python对象序列化成php能读取的格式(即能反序列化到对象)
    Atitit.研发管理---api版本号策略与版本控制
    Atitit.研发管理---api版本号策略与版本控制
    Atitit.jsou html转换纯文本 java c# php
    Atitit.jsou html转换纯文本 java c# php
    atitit.基于bat cli的插件管理系统.doc
    atitit.基于bat cli的插件管理系统.doc
    atititi.soa  微服务 区别 联系 优缺点.doc
    atititi.soa  微服务 区别 联系 优缺点.doc
    userService 用户 会员 系统设计 v2 q224 .doc
  • 原文地址:https://www.cnblogs.com/whuqin/p/4981972.html
Copyright © 2020-2023  润新知