海码充电站的技术专栏 java Coder

搜索引擎- -Lucene

2018-12-28
watermelon


Lucene

前言

Lucene 搜索引擎介绍

1、了解Lucene

纠结了波发音,到底怎么念:

  • 版本1:发音为[‘lusen]
  • 版本2:读音应该是[‘lu:si:n],这是作者妻子的中间名 (不过因为大家都读错,传来传去可能读lusen的人更多) 就好像hadoop读音应该是[hædu:p]一样, 包括很多电子词典在内,都会错读成[h∧du:p]

博主比较懒,有识之士帮忙确认下。

ok,正式介绍下Lucene:
Lucene即全文检索。全文检索是计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置。当用户查询时根据建立的索引查找,类似于通过字典的检索字表查字的过程。

1:使用流程及原理

1:创建索引

  • 第一步:准备一些要索引的原文档
  • 第二步:将原文档传给分词组件
  • 第三步:将得到的词元(Token)传给语言处理组件(Linguistic Processor)。
  • 第四步:将得到的词(Term)传给索引组件(Indexer)。
    1. 利用得到的词(Term)创建一个字典。
    2. 对字典按字母顺序进行排序。
    3. 合并相同的词(Term)成为文档倒排(Posting List)链表。

2:对索引进行搜索

  • 第一步:用户输入查询语句。
  • 第二步:对查询语句进行词法分析,语法分析,及语言处理。
    1. 词法分析主要用来识别单词和关键字。
    2. 语法分析主要是根据查询语句的语法规则来形成一棵语法树。
    3. 语言处理同索引过程中的语言处理几乎相同。
  • 第三步:搜索索引,得到符合语法树的文档。
  • 第四步:根据得到的文档和查询语句的相关性,对结果进行排序。
    1. 计算权重(Term weight)的过程。
    2. 判断 Term 之间的关系从而得到文档相关性的过程,也即向量空间模型的算法(VSM)。

参考《Lucene 原理与代码分析完整版

2、全文检索和数据库检索的区别

1:性能:
  • 数据库检索:like检索,会把表当中数据进行一行一行的扫描。性能man
  • Lucene检索:先把数据拿过来建立索引,然后再根据建立的索引进行查找。这样的话我们需要多维护一份索引库。多了一个创建索引的过程,但是我们是一次创建,多次使用。
2:相关度排序
  • Lucene排序:对查询出来的每个document都有一个算法算出得分,得分越高,排列的顺序越靠前。支持人工干预(通过设置权重值)。
  • 数据库检索排序:order by

代码:

public static Document articleToDocument(Article article){
    Document document=new Document();
    IntField idfield=new IntField("id",article.getId(),Store.YES);
    StringField authorfield=new StringField("author", article.getAuthor(), Store.YES);
    StringField urlfield=new StringField("link", article.getLink(), Store.YES);
    TextField title=new TextField("title", article.getTitle(),Store.YES);
    
    //设置权重值,默认为1f..
    title.setBoost(4f);
    TextField contentfield=new TextField("content", article.getContent(),Store.YES);
    document.add(idfield);
    document.add(authorfield);
    document.add(urlfield);
    document.add(title);
    document.add(contentfield);
    return document;
}
3:匹配的准确度
  • 数据库检索: 通过like 关键字进行检索 其中相关文字得用 % 来表示 如:like %ant%
  • Lucene检索:先把数据拿过来分词建立索引,根据建好的索引进行查找。

    3、使用

    springboot整合Lucene

拓展:


上一篇 队列- -kafka

Comments

Content