一个用lucene开发的小型搜索引擎
搜索引擎,通常指的是收集了因特网上几千万到几十亿个网页并对网页中的每一个词(即关键词)进行索引,
建立索引数据库的全文搜索引擎。
当用户查找某个关键词的时候,所有在页面内容中包含了该关键词的网页都将作为搜索结果被搜出来。
在经过复杂的算法进行排序后,这些结果将按照与搜索关键词的相关度高低,依次排列。
搜索引擎的工作分为四个步骤:
1. 爬行和抓取
2.索引
3.搜索词处理
4.排序
以上内容来自百度百科,搜索引擎原理。
第一步 准备raw files和lucene的对象文件
其中爬行和抓取需要很长时间去下载网页。这里为了快速实现一个搜索引擎。我使用数据库中的记录作为搜索引擎的raw file 来代替下载的网页。
在lucene中有特定的函数用来为raw file 来建立索引。
在建立索引的过程中,lucene使用特有的文件形式(document)来存储待建立的文件。
一个document 中可以存放若干个字段,和字段对应的值。
例如:
Document doc = new Document();
doc.add( new Field("Name"), //字段名
"小明", //字段值
Field.Store.YES, //是否在索引中存储字段值
Field.Index.UN_TOKENIZED)); //是否在建立索引时做字段分析
这样一个含有一个字段的doc就完成了。当然还可以继续加字段,方法同上。
第二步 建立索引
在介绍完lucene的对象文件后,开始正式的索引的建立。
IndexWriter writer = new IndexWriter(INDEX_DIR, new StandardAnalyer(),NoAppand);
上面的语句是建立一个目标目录为INDEX_DIR, 使用Standard词分析器建立的索引。(NoAppand待查)
writer有一个方法addDocument方法,用来向索引writer中添加对象文件。
writer.addDocument(doc);
然后writer.optimise();对所要建立的索引进行优化。
最后关闭writer.close(),将建立的索引存入指定目录。
第三步 搜索与搜索词的处理
与IndexWrieter 相对应的 有一个IndexReader 类 用于在读取指定目录中索引。
IndexReader reader = IndexReader.open(INDEX_DIR);
用于搜索的类是Search,Search需要一个reader来进行搜索。
Search search = new Search(reader);
这时我们并不能直接将关键词扔给search。因为搜索的方法(分词,组合逻辑)很多,可搜索的域(字段)也很多。searcher并不知道用何种方式去搜索。
所以我们需要对关键词进行处理,指定一种搜索方式(其实有好多种,这里只介绍一种,另外的另篇分解)。
QueryParser parser = new QueryParser("name" , new StandardAnalyzer());
parser 就规定了一种搜索的分词方法,确定搜索域。
现在我们将要搜索的关键词传给parser得到一个Query。
Query是个接口,parser根据不同的关键词类型和分词方法返回不同的Query的实例化,每种实例化就是一种搜索的方法。
Query query = parser.parse("小明"); 这是query的类型就是TermQuery //如果是"{100 TO 155}" ,则query的类型为RangeQuery (稍后分解)
到了这时,终于可以搜索了:
Hits hits =searcher.search(query);
搜索的结果就存在了 hits 中。
通过 hits.doc(0,1,2...) 就可以得到找到的检索到的document。
hits.score(0,1,2...) 可以得到每个检索到的记录的"得分"。