Lucene全文检索学习入门

今天开始接触Lucene搜索,Lucene是一个全文检索的框架,主要适用于搜索,这里的搜索不同于天龙八部私服数据库的查询。Lucene是建立索引然后存在你设置的路径或者内存中,然后当你输入条件的时候就会去索引文件检索查询。Lucene能够实现分词和查询结构高亮的功能,而且在其强大的天龙八部私服架构下全文检索的速度是比较快的。由于Lucene将数据分词后以索引方式存储,这就势必会占内存或空间(Lucene的索引存储一般有文件存储和内存存储2种方式),我们就会将不必要的东西不存储。而我们一般在使用Lucene和数据库结合的时候,像主键这些是要存的,就有利于我们在搜索的时候得到document对象同时也能得到存储在里面的主键,然后就可以通过主键获取数据库里面的数据。

接下来开始第一个Lucene程序,首先导入lucene-core.jar的包,Lucene基本所有重要的类都在core包中。

public class Test1 {
private static Directory directory;static{
    directory = new RAMDirectory();
}public static void main(String[] args) {
    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
    IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_35, analyzer);    try {
        IndexWriter writer = new IndexWriter(directory, conf);
        Document doc = null;        for(int i=1;i<=10;i++){
            doc = new Document();
            doc.add(new Field("name", "dlm"+i, Field.Store.YES, Field.Index.NOT_ANALYZED));
            doc.add(new Field("pass", "wei dlm"+i, Field.Store.YES, Field.Index.ANALYZED));
            writer.addDocument(doc);
        }
        doc = new Document();
        doc.add(new Field("name", "sdlm", Field.Store.YES, Field.Index.NOT_ANALYZED));
        writer.addDocument(doc);
        writer.commit();
        IndexReader reader = IndexReader.open(directory);
        IndexSearcher searcher = new IndexSearcher(reader);
        TermQuery query = new TermQuery((new Term("name","dlm1")));
        TopDocs topDocs = searcher.search(query, 20);
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;        for(ScoreDoc s:scoreDocs){
            Document d = searcher.doc(s.doc);
            System.out.println(s.score+"===="+d.get("name")+"--"+d.get("pass"));
        }
    searcher.close();
    reader.close();
    writer.close();
    } catch (IOException e) {        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

Directory对象是指管理索引文件存储位置的对象,RAMDirectory即表示将索引存储在内存,当然程序一运行结束,索引也就不存在了。然后创建分词器Analyzer表示分词器,在这里我使用的是标准分词器StandardAnalyzer,当然不同的分词器实现的功能也不是一样的(StopAnalyzer停词分词器,WhitespaceAnalyzer空格分词器),这些所有的分词器都是不支持中文分词的。然后创建IndexWriterConfig对象以此创建IndexWriter对象,IndexWriter主要用于存储索引,所以我们传入Directory和IndexWriterConfig。Document是存放待存储内容和待创建的索引对象,Field.Store.YES就是前面提到的是否存储,一一般内容不需要存储,这里存储指储存到天龙八部私服索引文件中,我们后面查询出来能够Document.get(name)获取到存储的值,设置NO即不能存储就不能取出值。Field.Index.ANALYZED 进行分词和索引,适用于文章天龙八部关系任务探秘标题、内容, Field.Index.NOT_ANALYZED 进行索引但是不分词,如身份证、ID,适用于精确搜索Field.Index.NOT_ANALYZED_NO_NORMS 既不分词也不存储normal信息, Field.Index.ANALYZED_NO_NORMS 分词不存储normal信息,Field.Index.NO 不分词不索引。添加完后需要提交commit,不然搜索不到索引。

IndexReader由open(Directory)即找到天龙八部私服索引的位置,IndexSearcher由reader获取得到,TermQuery表示精确查询,在这里输入dlm是查找不到结果的,searcher.search(query, 20);表示查找20条数据,topDocs.scoreDocs获得查询的结果集,然后遍历结果集,searcher.doc(s.doc);s.doc表示该查询结构所在的位置,然后得到document对象,就可以获得存储在天龙八部私服http://www.alishouhui.com索引文件中的值了。

时间: 2024-10-10 12:52:13

Lucene全文检索学习入门的相关文章

Lucene第一个入门学习例子

看Lucene in Action的时候,练习的一个入门例子. 在使用Lucene进行文本内容搜索前,需要先对指定的目录下的文件进行建立索引,代码如下: import java.io.File; import java.io.FileFilter; import java.io.FileReader; import java.io.IOException; import org.apache.lucene.analysis.standard.StandardAnalyzer; import or

Lucene 学习入门

Lucene 4.9 基础准备 了解常用分词器,选择合适分词器 读取文件编码要正确,非TXT文档需要进行特殊处理或特殊工具读取后才进行分词处理 TextField内容不能保存过长,最大长度是32766个字节 StringField, TextField 的区别,其他 StringField 不进行分词处理,保存 TextField 进行分词处理,默认不保存,可以选择保存,最大长度是 32766字节 其他省略- Demo参考: org.apache.lucene.demo.IndexFiles o

jQuery、HTML5、Spring Security安全权限、Lucene全文检索

获取[下载地址]   QQ: 313596790   [免费支持更新]支持三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体[新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统]A 代码生成器(开发利器);      增删改查的处理类,service层,mybatis的xml,SQL( mysql   和oracle)脚本,   jsp页面 都生成   就不用写搬砖的代码了,生成的放到项目里,可以直接运行B 阿里巴巴数据库连接池druid

OPEN(SAP) UI5 学习入门系列之一:扫盲与热身(下)

1 UI5代码结构 上一次我们一起用了20秒的时间完成一个UI5版的Hello World.应用打开后有一个按钮,按钮的文字是Hello World,点击这个按钮之后,按钮会慢慢的消失掉(Fade out). 那我们这次就来看一看为了实现这么一个简单的功能,OpenUI5框架至少需要提供哪些内容,或者说我们通过这么一个简单的应用来看一下一个最简单的UI5的应用程序的结构. HTML部分应该不用多说,我们只看和UI5相关的代码,第一部分我们称为Bootstrap,包含以下代码段: <!-- 1.)

模拟电路学习入门的建议(综合整理)

转载自:http://bbs.eetop.cn/viewthread.php?tid=170164 ”模拟电路学习入门“ "如何才算学好模电,数电"一帖引来大家的关注.这里把各位DX的意见整理了一下,便于大家参考.真正掌握一门技术不容易,大家从不同的侧面和经验谈谈自己的体会,对从事这行业的工程师会有点启迪. 找些實用線路集錦或電子製作書看看,有感興趣的就找找理論資料,然後動手練練,很快就是門內漢(or女)了! 先看基本书,再动手练习练习 Razav 如果有耐心看大头英文最好,翻译也很不

OPEN(SAP) UI5 学习入门系列之四:更好的入门系列-官方Walkthrough

好久没有更新了,实在不知道应该写一些什么内容,因为作为入门系列,实际上应该更多的是操作而不是理论,而在UI5 SDK中的EXPLORER里面有着各种控件的用法,所以在这里也没有必要再来一遍,还是看官方的用法更地道. 看一下基于最新的库所推荐的项目结构. 另外,我觉得对于初学者来说是一个非常好的消息,就是UI5版本从1.28更新到1.30以及更高之后,Tutorial系列有了重大更新,之前的Get Started->Tutorials->Application Best Practice现在改为

【Todo】Lucene系统学习

之前已经写过一篇关于Lucene安装学习的文章:http://www.cnblogs.com/charlesblc/p/5980525.html 还有一篇关于Solr安装使用的文章:http://www.cnblogs.com/charlesblc/p/5981292.html 上面两篇比较偏实践和应用,开了个头:这一篇是在上面两篇基础上,针对Lucene原理再进行的学习. 参考的文章有:http://www.cnblogs.com/forfuture1978/archive/2009/12/1

JSON--JSON学习入门(了解什么是JSON)

JSON格式化工具:tool.oschina.net/codeformat/json JSON定义 JSON(JavaScript Object Notation)一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.可在不同平台之间进行数据交换.JSON采用兼容性很高的.完全独立于语言文本格式,同时也具备类似于C语言的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)体系的行为.这些特性使JSON成为理想的数据交换语言. JSON基于Ja

MySQL快速学习入门

#MySQL快速学习入门 #MySQL选择数据库(USE) USE test; #MySQL表字段类型 #INT - 正常大小的整数,可以带符号.如果是有符号的,它允许的范围是从-2147483648到2147483647.如果是无符号,允许的范围是从0到4294967295.可以指定多达11位的宽度. #TINYINT - 非常小的整数,可以带符号.如果是有符号,它允许的范围是从-128到127.如果是无符号,允许的范围是从0到255,可以指定多达4位数的宽度. #SMALLINT - 小的整