危机公关

介绍一款全文搜索引擎--lucene

  • 时间:
  • 浏览:32296

今天我想给大家介绍的  ,是一款叫做lucene的开源搜索引擎  。它是基于java环境下的  ,一款全文搜索引擎  。如果你需要对非常多的文档进行搜索 ,可以考虑使用它  。

lucene进行搜索

1. 通过对目标文档的处理  ,得到一个新的处理好的index  。

这些index是长成这个样子的:

在这里  ,lucene 所做的事情其实是把这些文档中的话先进行预处理  。比如lucene会把"BitTiger" 转换成"bitgtiger" 也就是全部小写化  。之后呢,lucene 会为你的文档建立一个matrix  。这里我直接开始举例说明 。

doc1 : "I love programming";

doc2: "programming is necessary skills and you should love it "

lucene 会建立如下的索引结构:

term docs location

I 1 1.0

love 1,2 1.2->2.47

programming 1,2 1.7->2.00

skills 2 2.26

and 2 ---

you 2 ---

it 2 ---

is 2 ---

term 代表出现在文档中的一个一个词语  ,docs代表的是这个文档的编号  ,lcoation代表的是词语出现在文档中的某个位置  。在lucene当中 ,词语的位置是用一个linkedlist 串联起来的  。

如果你要对一段文档进行索引  ,在API  ,你要做的事情很简单 ,我在这里直接贴代码

String path = "XXXXX"; ----------- 你文档的路径

final Path docDirs = Paths.get(Path);

// 你建立索引的路径

Directory dic_siwei = FSDirectory.open(Paths.get("你建立一个大索引的路径"));

Analyzer analyzer = new StandardAnalyzer(); ------ 构建分析器 ,它的作用是对文档语言进行处理

//配置索引writer和建立一个索引

IndexWriterConfig conf = new IndexWriterConfig(analyzer);

IndexWriter writer = new IndexWriter(dic_siwei,conf);

Document docs = new Document();

这里docDir是单独一个文件的路径 ,我省略了之前的一个方法  ,大家知道就行

InputStream stream = Files.newInputStream(docDir);

doc.add(new TextField("contents", new BufferedReader(newInputStreamReader(stream, StandardCharsets.UTF_8))));

writer.close();

这之后  ,你们就可以创建好一份索引  。在这里你会问  ,如果我的添加了一个新的索引 ,那么我需不需要重新跑一次我的程序  ,去建立一个新的索引 。在这里,lucene处理的很好  。当你有新的文件需要进行处理  ,lucene提供了一个"updata" 接口可以将你的新内容加入到原来的索引文件中  。

2.建立好索引之后如何进行搜索  ?

我觉得在这里  ,我想谈谈lucene的打分机制  。比如我搜索“dota ti5”,我希望第一个搜索的结果文档叫做"dota2"而不是“英雄联盟(LOL)”.那么lucene是如何做的呢  ?

lucene 默认的搜索算法叫做TF/IDF 算法 。

2.1(TF/IDF 算法)

TF-IDF算法全称为term frequency–inverse document frequency 。TF就是term frequency的缩写  ,意为词频  。IDF则是inverse document frequency的缩写  ,意为逆文档频率 。

该算法在信息处理中通常用来抽取关键词  。比如  ,对一个文章提取关键词作为搜索词  ,就可以采用TF-IDF算法  。

要找出一篇文章中的关键词 ,通常的思路就是  ,就是找到出现次数多的词  。如果某个词很重要  ,它应该在这篇文章中多次出现  。于是 ,我们进行"词频"(Term Frequency ,缩写为TF)统计  。

但是通常  ,一篇中文的文章中 ,SEO网站排名 ,都会有很多没有实际意义的词  ,比如“的”  ,“是”  ,“了”  ,这类词是常用的词 ,称为停用词 ,称它们为停用词是因为在文本处理过程中如果遇到它们 ,则立即停止处理  ,将其扔掉  。将这些词扔掉减少了索引量  ,SEO排名  ,增加了检索效率  ,并且通常都会提高检索的效果  。停用词主要包括英文字符、数字、数学字符、标点符号及使用频率特高的单汉字等 。

当过滤掉所有的停用词后  ,剩下的都是实际意义的词  ,但也不能简单的认为那个词出现的次数多就是关键词  。比如在一篇如何组装电脑的文章中  ,出现“CPU”  ,“主板”等关键词和出现“说明书”的次数一样多 ,但很显然  ,CPU  ,主板等关键词  ,更能确定这个文章的特性  。也就是说 ,“CPU”  ,“主板”等关键词比“说明书”这个关键词更重要  ,需要排在前面 。所以我们就需要一个权重系数 ,用来调整各个关键词的重要性  。如果一个词很少见 ,但是它在某个文章中反复出现多次  ,那么可以认为这个词反应了这个文章的特性  ,可以把它作为关键词  。在信息检索中  ,这个权重非常重要  ,它决定了关键词的重要度  ,这个权重叫做"逆文档频率"(Inverse Document Frequency ,缩写为IDF)  ,它的大小与一个词的常见程度成反比 。