zoukankan      html  css  js  c++  java
  • Lucene的原理和应用

    随着互联网的迅速普及与发展,网络舆论对社会生活的影响力越来越大, 网络口碑研究也逐渐形成一个新兴行业。有效的网络口碑研究,需要全方位地倾听网民的声音。 信息检索技术的应用,有效地提高了网络口碑研究的工作效率。
        Lucene
    作为当今最知名的开源信息检索库,被广泛应用于各种与全文检索相关的项目中。 本文将简要介绍Lucene的基本原理与应用,在此抛砖引玉,希望能有机会与更多的同行进行交流。

    Lucene是什么

        Lucene 是一个开源的、成熟的全文索引与信息检索(IR)库,采用Java实现。它在系统中的地位,相当于一个主要用来全文检索的数据库,与系统其它模块的关系如下:


    Lucene
    与数据库的类比

      Lucene与数据库有许多相通之处,以下我们做个简单对比:

     

    数据库
    Luecene
    基本概念
    /字段
    Field
    /记录
    Document
    基本操作
    查询(SELECT)
    Searcher
    添加(INSERT)

    IndexWriter. addDocument

    删除(DELETE)
    IndexReader.delete
    修改(UPDATE)
    不支持(可删除后重新添加)

    Lucene与倒排索引(Inverted index)

      我想很多人在用数据库时,都遇到过这种类似的情况:查找含‘奥运会’这个词的数据, 一般都用 LIKE '%奥运会%' 作为条件的SQL语句进行。 这种解决方法,在数据量很大时,存在严重的性能问题。因为一般的数据库索引,对这种查询没有任何帮助。 Lucene作为主要应用于全文检索领域的库,引入了一种倒排索引的技术。

    相关概念
         Term = Field.name + Token.text
         Token
    分词后的最小单位,:2008年、奥运会、将、在、北京、举行
         Document
    每个Document有个唯一的内部编号ID(int类型),重建索引时ID可能变化
    倒排索引文件格式(示意图)
         Term1 DocID1 DocID2 DocID3 …
         Term2 DocID1 DocID2 DocID3 …
         … …

      从以上格式中不难看出,利用这种索引文件,可以迅速定位到包含‘奥运会’这个词的所有文章。

    中文分词与信息检索模型

        在上面的索引格式中可以看到,在建索引前,需要将一句话拆分为一个个词,这里就要用到中文分词技术。 常见中文分词算法:正向最大匹配法、逆向最大匹配法、基于统计的分词方法;  需要说明的是:Lucene仅提供了分词接口(没有中文分词实现),因此一般还有用到另外的第三方中文分词库。
        
    当检索到含‘奥运会’这个词的文章共有1万篇时,哪些应该排在最前面呢?这就涉及到Lucene的评分机制,默认Lucene评分采用的是信息检索中的向量空间模型理论。
        
    关于中文分词和信息检索模型,这是很大的一个研究课题。感兴趣的朋友,可以到网上搜索相关文章进行深入了解;

    使用lucene的常见问题与建议

    中文分词库: 网上可用的免费中文分词库有 IKAnalyzer(免费但不开源)Stanford(开源但需自行封装lucene接口)
    组合查询条件:通过使用QueryParser类,可以支持ANDOR等多种组合条件
    结果排序: lucene默认按评分排序,通过结合SortSortField类,可指定多个排序字段与升降序,排序字段的索引类型必须为UN_TOKENIZED
    分布式查询: 通过lucene提供的RemoteSearchable类,可以实现分布式查询
    并行查询: 当分布式有多个节点时,可以通过ParallelMultiSearcher进行并行,以提高检索性能
    分词与查询: 当索引中以‘奥运会’作为一个词时,通过‘奥运’是无法检索到相应结果的。这个问题可以通过修改检索条件或分词时按较小粒度进行处理
    数字与日期: lucene索引库一律按String类型处理,因此数字日期应补0,使能够正确按字符串比较排序
    字段索引类型:email日期等无需分词的字段,索引类型应选择UN_TOKENIZED
    线程安全性: 应保证同时只有一个线程对lucene库进行写操作,可以有多个线程对lucene库进行读操作

  • 相关阅读:
    STL源码剖析之_allocate函数
    PAT 1018. Public Bike Management
    PAT 1016. Phone Bills
    PAT 1012. The Best Rank
    PAT 1014. Waiting in Line
    PAT 1026. Table Tennis
    PAT 1017. Queueing at Bank
    STL源码剖析之list的sort函数实现
    吃到鸡蛋好吃,看看是哪只母鸡下的蛋:好用的Sqlite3
    cJSON
  • 原文地址:https://www.cnblogs.com/holdon521/p/4090194.html
Copyright © 2011-2022 走看看