zoukankan      html  css  js  c++  java
  • 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:对相关性打分模型的实现



  • 相关阅读:
    C# 函数
    截取字符串 超长 用冒号显示
    免费的webservice接口
    Visual Studio 2010扩展让JS与CSS实现折叠
    两个div同时滚动
    cn_office_professional_plus_2010_x86_515 安装激活方法解决方案64bit
    Info.plist配置相关文件访问权限
    iOS 同一个View识别单击和双击手势
    WKWebView简单使用
    TabBar背景颜色设置
  • 原文地址:https://www.cnblogs.com/whuqin/p/4981972.html
Copyright © 2011-2022 走看看