初学lucene-菜鸟篇

来源:互联网 发布:京东数据分析笔试 编辑:程序博客网 时间:2024/04/26 00:44

初次接触搜索,查了很多资料后,出现最多的一个关键词就是lucene,于是就去稍微看了一些,然后把一些基本的内容记录下来,方便以后回忆,同时也分享给一样的初学者。

首先了解一下什么是全文检索

举个例子:比如我们在一个磁盘上有很多文件,而有一天我想通过关键字搜索出包含的文件。如:我们输入lucene,所有内容含有lucene的文件都会被检查出来,这就是全文检索(鄙人的个人定义)。其实,通过上述的例子,我们很容易会想到,关键字与这些文件需要建立一个相关映射。在lucene中,其实是使用了一种“倒排索引”的技术来实现的。

有了这种映射关系,我们就来看看Lucene的架构设计(下图是网上很多资料中比较通用的一张图)


我们可以看到,lucene的使用主要体系在两个步骤:

1.创建索引,通过IndexWriter对不同文件进行索引的创建,并将其保存在索引相关文件存储的位置中。

2.通过索引查询关键字相关文档。


索引的创建

首先,我们需要定义一个词法分析器

比如:“我爱我们的中国!”,如何对他拆分,扣掉停顿词的“的”,提取关键词“我”,“我们”,“中国”等,这里我们借助Analyzer来实现

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);

第二步,确定索引文件存储位置

1 本地文件存储

Directory directory = FSDirectory.open("/tmp/testindex");

2 内存存储

Directory directory = new RAMDirectory();

两者按照自己需求进行选择


第三步,创建IndexWriter,进行索引文件的写入

IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_CURRENT, analyzer);IndexWriter iwriter = new IndexWriter(directory, config);

这里的IndexWriterConfig,其中包含了两个参数,第一个是目前的版本,第二个是词法分析器Analyzer。


第四步,内容提取,进行索引的存储

Document doc = new Document();String text = "This is the text to be indexed.";doc.add(new Field("fieldname", text, TextField.TYPE_STORED));iwriter.addDocument(doc);iwriter.close();

这就是索引创建的过程


关键字查询

第一步,打开存储位置

DirectoryReader ireader = DirectoryReader.open(directory);

第二步,创建搜索器

IndexSearcher isearcher = new IndexSearcher(ireader);

第三步,进行关键字查询

QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, "fieldname", analyzer);Query query = parser.parse("text");ScoreDoc[] hits = isearcher.search(query, null, 1000).scoreDocs;assertEquals(1, hits.length);for (int i = 0; i < hits.length; i++) {    Document hitDoc = isearcher.doc(hits[i].doc);    assertEquals("This is the text to be indexed.",hitDoc.get("fieldname"));}

第四步,关闭查询器

ireader.close();directory.close();
以上就是一个简单的建立索引与搜索关键字的流程。具体的demo这里就不写了。第一次写这个,所以也只是初略的讲些简单操作上的事情。希望以后能越写越好。这只是一个小小的开始。



0 0
原创粉丝点击