Lucene全文检索入门体验

Lucene是Apache开源的全文检索框架, 是单纯的搜索工具, 简单易用. 现在已经出到5.2.1的版本, 只需在项目中导入必需的几个jar包就能使用. 使用的过程可以概括为,

1)  建立索引

2) 搜索查找, 获取搜索结果

这里我们一起先来学习几个会用到的核心类:

Directory

该类在Lucene中用于描述索引存放的位置信息. 比如:

Directory dir = FSDirectory.open(Paths.get("c:\\lucene\\index")); 

其中" c:\\lucene\\index" 是存放索引的文件夹位置.

Analyzer

Analyzer是Lucene的分词器, 可以说是分词解析技术也可以说是搜索引擎的核心技术之一. 一句话被断句分词分析, .使搜索结果更智能更精准. 中文词库分词, 可以使用IKAnalyzer等中文分词工具包.

Analyzer这个类的作用要结合IndexWriterConfig和IndexWriter这两个类去认识:

IndexWriterConfig, 从类名可知, 是一个保存参数配置的类, 用于生成IndexWriter. 比如:

IndexWriterConfig iwc = new IndexWriterConfig(luceneAnalyzer);
            iwc.setOpenMode(OpenMode.CREATE);
            IndexWriter indexWriter = new IndexWriter(dir,iwc); 

setOpenMode(...) 设置了IndexWriter的打开方式.

当然还有更多的参数设置, 可以参考这篇文章哦. IndexWriterConfig配置参数说明

上面的三行代码也是创建一个IndexWriter的过程. (dir这个参数就是第一个提及的类Directory.)

IndexWriter 是建立索引的核心类. 如果你也知道Android的SharePreference, SharePreference里面有一个Editor类. IndexWriter 就是类似Editor这样的类, 可以针对索引进行添加(创建新的索引并写入索引文档中), 删除(从索引文档删除索引)和更新(更新索引文档中的索引) 操作. 顺便提一下, Lucene的索引, 会生成对应的索引文档, 所以最好建立文件夹专门存放这些文档.

Document

Document类顾名思义是"文件"类, 其实它是用来存放Field集合. 可以理解为存放文件, 一般都是可转换的文本信息, 比如doc, txt等等. 当把用于被查找的文件信息加入Document后, 再通过

indexWriter.addDocument(document);

这样就添加了一个索引. 来到这里, 也许你会想到, 以后要查询直接先来索引这里就行了.

IndexReader

对应于IndexWriter, 就有IndexReader. 创建方法 :

IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get(index)));

它只读取索引文档. 然后交给检索工具IndexSearcher 去完成查找. 根据传进Query检索条件进行检索查找后, 会得到一个ScoreDoc类型的结果集, 然后读取它的Document信息, 就能获取检索结果的具体信息, 比如关键字包含在哪些内容中, 已经这些内容文档的存放路径等等. 这样就算是完成整个检索过程了.

OK, 下面我们来简单的例子体验下, 有兴趣可以自己去看文档详细了解哦.

注: 本例子的代码来自网络, 是很简单易懂的例子, 所以就不再另外写了, 这里只是体验学习, 我们直接学习别人的. 额, 原作者不知道是谁了, 在这里感谢一下. 

经过上面的关键类的介绍, 相信看下面例子的代码会容易懂很多了, So 直接上代码.

1) 建立索引文档.

随便在本地建立一个文件夹, 比如C盘根目录创建index文件夹. 路径就是 C:\index . 而要检索的内容文档放在 C盘根目录的source文件夹中, 路径就是C:\source .

public class CreateIndex {
	 public static void main(String[] args) throws Exception {
         /* 指明要索引文件夹的位置,这里是C盘的source文件夹下 */
        File fileDir = new File("C:\\source");    

         /* 这里放索引文件的位置 */
         //File indexDir = new File("c:\\index");
         String indexPath = "c:\\index";

         // Directory dir = FSDirectory.open(indexDir);    //v3.6.0
         Directory dir = FSDirectory.open(Paths.get(indexPath));  

         //Analyzer luceneAnalyzer = new StandardAnalyzer(Version.LUCENE_3_6_0);
         Analyzer luceneAnalyzer = new StandardAnalyzer();
         IndexWriterConfig iwc = new IndexWriterConfig(luceneAnalyzer);
         iwc.setOpenMode(OpenMode.CREATE);
         IndexWriter indexWriter = new IndexWriter(dir,iwc);
         File[] textFiles = fileDir.listFiles();
         long startTime = new Date().getTime();    

         //增加document到索引去
         for (int i = 0; i < textFiles.length; i++) {
             if (textFiles[i].isFile()
                    ) {
                 System.out.println("File " + textFiles[i].getCanonicalPath()
                         + "正在被索引....");
                 String temp = FileReaderAll(textFiles[i].getCanonicalPath(),
                         "GBK");
                 System.out.println(temp);
                 Document document = new Document();    

                 Field FieldPath = new StringField("path", textFiles[i].getPath(), Field.Store.YES);
                 Field FieldBody = new TextField("body", temp, Field.Store.YES);
                 document.add(FieldPath);
                 document.add(FieldBody);
                 indexWriter.addDocument(document);
             }
         }
         indexWriter.close();    

         //测试一下索引的时间
         long endTime = new Date().getTime();
         System.out
                 .println("这占用了"
                         + (endTime - startTime)
                         + " 毫秒来把文档增加到索引里面去!"
                         + fileDir.getPath());
     }    

     public static String FileReaderAll(String FileName, String charset)
             throws IOException {
         BufferedReader reader = new BufferedReader(new InputStreamReader(
                 new FileInputStream(FileName), charset));
         String line = new String();
         String temp = new String();    

         while ((line = reader.readLine()) != null) {
             temp += line;
         }
         reader.close();
         return temp;
     }    

}

2) 执行检索查找的类:

public class ExecuteQuery {
	public static void main(String[] args) throws  IOException, ParseException  {
        String index="c:\\index";//搜索的索引路径
     //   IndexReader reader=IndexReader.open(FSDirectory.open(Paths.get(index));    //v3.6.0的写法
        IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get(index)));
        IndexSearcher searcher=new IndexSearcher(reader);//检索工具
        ScoreDoc[] hits=null;
        String queryString="好";  //搜索的索引名称
        Query query=null;
        Analyzer analyzer= new StandardAnalyzer();
        try {
            //QueryParser qp=new QueryParser(Version.LUCENE_3_6_0,"body",analyzer);//用于解析用户输入的工具   v3.6.0
        	QueryParser qp=new QueryParser("body",analyzer);//用于解析用户输入的工具
            query=qp.parse(queryString);
        } catch (ParseException e) {
            // TODO: handle exception
        }
        if (searcher!=null) {
            TopDocs results=searcher.search(query, 10);//只取排名前十的搜索结果
            hits=results.scoreDocs;
            Document document=null;
            for (int i = 0; i < hits.length; i++) {
                document=searcher.doc(hits[i].doc);
                String body=document.get("body");
                String path=document.get("path");
                String modifiedtime=document.get("modifiField");
                System.out.println("BODY---"+body+"      ");
                System.out.println("PATH--"+path);
            }
            if (hits.length>0) {
                System.out.println("输入关键字为:"+queryString+","+"找到"+hits.length+"条结果!");  

            }
          //  searcher.close();
            reader.close();
        }
    }  

}

例子里面是搜索"好"字. 效果如图:

然后修改一下内容文档:

搜索"努力"

中文搜索ok~

当然这是很简单的例子. 本文只是体验学习, 让我们在以后实现全文检索时多一个学习研究的方向. 另外, 好的检索工具, 分词器是非常关键的. 同时英文和中文的词库又不一样. 所以在实现真正的检索时就要考虑这些影响搜索结果的因素.

例子源码

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 19:31:50

Lucene全文检索入门体验的相关文章

Lucene 全文检索入门

博客地址:http://www.moonxy.com 一.前言 Lucene 是 apache 软件基金会的一个子项目,由 Doug Cutting 开发,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的库,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言).Lucene 的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎.Lucene 是一套用于全文

Lucene全文检索入门使用

一. 什么是全文检索 全文检索是计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置.当用户查询时根据建立的索引查找,类似于通过字典的检索字表查字的过程 全文检索(Full-Text Retrieval)以文本作为检索对象,找出含有指定词汇的文本.全面.准确和快速是衡量全文检索系统的关键指标. 关于全文检索,我们要知道: 1.只处理文本. 2,不处理语义. 3,搜索时英文不区分大小写. 4,结果列表有相关度排序. 二. 全文检索与数据库检索的区别 全文检索

全文检索:Apache Lucene框架入门实例

一 简介 Lucene属于Apache开源项目的一部分,是一个开源的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言) Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎.在Java开发环境里Lucene是一个成熟的免费开源工具.就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序

1.搜索引擎的历史,搜索引擎起步,发展,繁荣,搜索引擎的原理,搜索技术用途,信息检索过程,倒排索引,什么是Lucene,Lucene快速入门

 一: 1  搜索引擎的历史 萌芽:Archie.Gopher Archie:搜索FTP服务器上的文件 Gopher:索引网页 2  起步:Robot(网络机器人)的出现与spider(网络爬虫) Robot基于网络的,可以执行特定任务的程序 Spider:特殊的机器人,网络爬虫,爬取互联网上的信息(可以是文件,网络)----网络自动下载程序 3   发展阶段:excite,galaxy,yahoo这些公司做搜索 4   繁荣:infoseek,AltaVista,Google和百度 5  

Lucene.net入门学习系列(1)

Lucene.net入门学习系列(1)-分词 Lucene.net入门学习系列(2)-创建索引 Lucene.net入门学习系列(3)-全文检索 这几天在公司实习的时候闲的蛋疼,翻了一下以往的教程和博客,看到了Lucene.net.原本想学着写一个系列的博文,由于本人水平有限,一直找不到适合的内容来写,干脆就写一个简单的Lucene.net系列文章吧.希望和大家一起学习,一起进步,有什么写错了或者有什么建议欢迎提出来. 一.引言 先说一说什么是Lucene.net.Lucene.net是Luce

【转载】Lucene.Net入门教程及示例

本人看到这篇非常不错的Lucene.Net入门基础教程,就转载分享一下给大家来学习,希望大家在工作实践中可以用到. 一.简单的例子 //索引Private void Index(){    IndexWriter writer = new IndexWriter(@"E:\Index", new StandardAnalyzer());    Document doc = new Document();    doc.Add(new Field("Text",&qu

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

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

第1章Java入门体验

第1章Java入门体验 1.java简介和平台应用 Java是sun公司开发出来,现在属于ORACLE公司java分为几个部分:首先是最基础的Java SE部分,这部分是Java的基础知识,主要包括:变量.语法.面向对象,API,JVM等等再Java SE基础之上分为两个部分.一个是开发企业级的服务,一个是嵌入式的开发Java EE是企业级的开发,主要包括:JSP.EJB.服务等等.Java ME是嵌入式的开发,主要有移动设备,游戏,通信等初学的基本路线都是从Java SE出发,先学基础,再学方

Lucene全文检索

 全文检索(Full-Text Retrieval)是指以文本作为检索对象,找出含有指定词汇的文本.全面.准确和快速是衡量全文检索系统的关键指标. l关于全文检索,我们要知道: 1,只处理文本. 2,不处理语义. 3,搜索时英文不区分大小写. 4,结果列表有相关度排序. l在信息检索工具中,全文检索是最具通用性和实用性的. Lucene全文检索