`
y806839048
  • 浏览: 1120564 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

lucene索引

阅读更多

Lucene介绍:

注意:在建立索引搜索时如果中间有乱码的话,是没有效果的

后续会增加遍历源文件夹,各种格式转为为txt

       Lucene是一个高性能,可伸缩的全文检索工具包,可以使用他为你的应用程序添加索引和搜索能力。(注:它不是一个完整的搜索应用程序),Lucene目前是我们熟知的Apache里的一个开发项目,也是目前最为流行的基于Java开源全文检索工具包。

       官网:http://lucene.apache.org/,从官网上看可以发现其版本不止Java的还有.NET等等。

       目前已经有很多应用程序的搜索功能是基于Lucene的,例如我们用的Eclipse在第一次使用的时候,会有一个进度条,那就是创建索引的过程,方便Eclipse 的帮助系统的搜索功能。Lucene能够为文本类型的数据建立索引,所以你只要能把你要索引的数据格式转化为文本的,Lucene就能对你的文档进行索引和搜索。比如你要对一些HTML文档、PDF文档进行索引的话你就首先需要把HTML文档和PDF文档转换为文本格式的,然后将转换后的内容交给Lucene进行索引,然后再把创建好的索引文件保存到磁盘或内存中,最后根据用户输入的查询条件在索引文件上进行查询。

搜索应用程序和Lucene之间的关系:

 

 

在用之前,我们再来对一些Lucene里的名字进行解释一下

IndexWriter: Lucene中最重要的的类之一,它主要是用来将文档加入索引,同时控制索引过程中的一些参数使用。操作索引库   

    Analyzer:分析器,主要用于分析搜索引擎遇到的各种文本。常用的有StandardAnalyzer分析器,StopAnalyzer分析器,WhitespaceAnalyzer分析器等。   

    Directory:索引存放的位置; Lucene提供了两种索引存放的位置,一种是磁盘,一种是内存。一般情况将索引放在磁盘上;相应地lucene提供了FSDirectoryRAMDirectory两个类。   

    Document:文档;Document相当于一个要进行索引的单元,任何可以想要被索引的文件都必须转化为Document对象才能进行索引。   

    Field:字段。   

    IndexSearcher:Lucene中最基本的检索工具,所有的检索都会用到IndexSearcher工具;   

    Query:查询,Lucene中支持模糊查询,语义查询,短语查询,组合查询等等,如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery等一些类。   

    QueryParser: 是一个解析用户输入的工具,可以通过扫描用户输入的字符串,生成Query对象。   

    TopDocs:在搜索完成之后,需要把搜索结果返回并显示给用户,只有这样才算是完成搜索的目的。

 

 

 

Ok,废话就这么多,直接上代码。

 

FirstLucene

1、添加jar

lucene-core-3.5.0.jar(核心)

lucene-analyzers-3.5.0.jar(分词器)

lucene-highlighter-3.5.0.jar(高亮器)

2、建立索引

3、搜索

 

    1. package com.iflytek.lucene;  
  •   
  1. import java.io.File;  
  2.   
  3. import org.apache.lucene.analysis.Analyzer;  
  4. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  5. import org.apache.lucene.document.Document;  
  6. import org.apache.lucene.index.IndexReader;  
  7. import org.apache.lucene.index.IndexWriter;  
  8. import org.apache.lucene.index.IndexWriterConfig;  
  9. import org.apache.lucene.queryParser.MultiFieldQueryParser;  
  10. import org.apache.lucene.queryParser.QueryParser;  
  11. import org.apache.lucene.search.Filter;  
  12. import org.apache.lucene.search.IndexSearcher;  
  13. import org.apache.lucene.search.Query;  
  14. import org.apache.lucene.search.ScoreDoc;  
  15. import org.apache.lucene.search.TopDocs;  
  16. import org.apache.lucene.store.Directory;  
  17. import org.apache.lucene.store.FSDirectory;  
  18. import org.apache.lucene.util.Version;  
  19.   
  20. /** 
  21.  * @author xudongwang 2012-2-2 
  22.  *  
  23.  *         Email:xdwangiflytek@gmail.com 
  24.  */  
  25. public class FirstLucene {  
  26.   
  27.     /** 
  28.      * 源文件路径 
  29.      */  
  30.     private String filePath01 = "F:\\Workspaces\\workspaceSE\\BlogDemo\\luceneDatasource\\HelloLucene01.txt";  
  31.     private String filePath02 = "F:\\Workspaces\\workspaceSE\\BlogDemo\\luceneDatasource\\HelloLucene02.txt";  
  32.     private String filePath03 = "F:\\Workspaces\\workspaceSE\\BlogDemo\\luceneDatasource\\HelloLucene03.txt";  
  33.   
  34.     /** 
  35.      * 索引路径 
  36.      */  
  37.     private String indexPath = "F:\\Workspaces\\workspaceSE\\BlogDemo\\luceneIndex";  
  38.   
  39.     /** 
  40.      * 分词器,这里我们使用默认的分词器,标准分析器(好几个,但对中文的支持都不好) 
  41.      */  
  42.     private Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);  
  43.   
  44.     /** 
  45.      * 创建索引 
  46.      *  
  47.      * @throws Exception 
  48.      */  
  49.     public void createIndex() throws Exception {  
  50.         Document document01 = File2Document.file2Document(filePath01);// 要进行索引的单元  
  51.         Document document02 = File2Document.file2Document(filePath02);  
  52.         Document document03 = File2Document.file2Document(filePath03);  
  53.   
  54.         // 将Document添加到索引库中  
  55.   
  56.         File indexFile = new File(indexPath);  
  57.         Directory directory = FSDirectory.open(indexFile);  
  58.         // IndexWriter是用来操作(增、删、改)索引库的  
  59.         // true,表示每次都创建新的,有了就删掉再创建  
  60.         IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_35,  
  61.                 analyzer);  
  62.         IndexWriter indexWriter = new IndexWriter(directory, conf);  
  63.         indexWriter.addDocument(document01);  
  64.         indexWriter.addDocument(document02);  
  65.         indexWriter.addDocument(document03);  
  66.         indexWriter.close();// 涉及到资源的都需要释放  
  67.     }  
  68.   
  69.   
  70.     /** 
  71.      * 搜索 
  72.      *  
  73.      * @param queryStr 
  74.      *            搜索的关键词 
  75.      * @throws Exception 
  76.      */  
  77.     public void search(String queryStr) throws Exception {  
  78.   
  79.         // 1、把要搜索的文本解析为Query对象  
  80.         // 指定在哪些字段查询  
  81.         String[] fields = { "name""content" };  
  82.         // QueryParser: 是一个解析用户输入的工具,可以通过扫描用户输入的字符串,生成Query对象。  
  83.         QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_35,  
  84.                 fields, analyzer);  
  85.         // Query:查询,lucene中支持模糊查询,语义查询,短语查询,组合查询等等,如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery等一些类。  
  86.         Query query = queryParser.parse(queryStr);  
  87.         // 2、进行查询  
  88.         File indexFile = new File(indexPath);  
  89.   
  90.         // IndexSearcher 是用来在索引库中进行查询的  
  91.         // IndexSearcher indexSearcher = new  
  92.         // IndexSearcher(FSDirectory.open(indexFile));  
  93.         Directory directory = FSDirectory.open(indexFile);  
  94.         IndexReader indexReader = IndexReader.open(directory);  
  95.         IndexSearcher indexSearcher = new IndexSearcher(indexReader);  
  96.         // Filter 过滤器,我们可以将查出来的结果进行过滤,可以屏蔽掉一些不想给用户看到的内容  
  97.         Filter filter = null;  
  98.         // 10000表示一次性在数据库中查询多少个文档  
  99.         // topDocs 类似集合  
  100.         TopDocs topDocs = indexSearcher.search(query, filter, 10000);  
  101.         System.out.println("总共有【" + topDocs.totalHits + "】条匹配的结果");// 注意这里的匹配结果是指文档的个数,而不是文档中包含搜索结果的个数  
  102.         // 3、打印结果  
  103.         for (ScoreDoc scoreDoc : topDocs.scoreDocs) {  
  104.             int docSn = scoreDoc.doc;// 文档内部编号  
  105.             Document document = indexSearcher.doc(docSn);// 根据文档编号取出相应的文档  
  106.             File2Document.printDocumentInfo(document);// 打印出文档信息  
  107.         }  
  108.     }  
  109.   
  110.     public static void main(String[] args) throws Exception {  
  111.         FirstLucene lucene = new FirstLucene();  
  112.         //lucene.createIndex();  
  113.         lucene.search("other");  
  114.         System.out.println("---------------------------");  
  115.         lucene.search("iteye");  
  116.         System.out.println("---------------------------");  
  117.         lucene.search("too");  
  118.         System.out.println("---------------------------");  
  119.     }  
  120.   
  121. }  

File2Document.java:

 

  1. package com.iflytek.lucene;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.File;  
  5. import java.io.FileInputStream;  
  6. import java.io.FileNotFoundException;  
  7. import java.io.IOException;  
  8. import java.io.InputStreamReader;  
  9.   
  10. import org.apache.lucene.document.Document;  
  11. import org.apache.lucene.document.Field;  
  12. import org.apache.lucene.document.Field.Index;  
  13. import org.apache.lucene.document.Field.Store;  
  14.   
  15. /** 
  16.  * @author xudongwang 2012-2-2 
  17.  *  
  18.  *         Email:xdwangiflytek@gmail.com 
  19.  */  
  20. public class File2Document {  
  21.     /** 
  22.      * File--->Document 
  23.      *  
  24.      * @param filePath 
  25.      *            File路径 
  26.      *  
  27.      * @return Document对象 
  28.      */  
  29.     public static Document file2Document(String filePath) {  
  30.         // 文件要存放:name,content,size,path  
  31.         File file = new File(filePath);  
  32.   
  33.         Document document = new Document();  
  34.         // Store.YES 是否存储 yes no compress(压缩之后再存)  
  35.         // Index 是否进行索引 Index.ANALYZED 分词后进行索引,NOT_ANALYZED 不索引,NOT_ANALYZED  
  36.         // 不分词直接索引  
  37.         document.add(new Field("name", file.getName(), Store.YES,  
  38.                 Index.ANALYZED));  
  39.         document.add(new Field("content", readFileContent(file), Store.YES,  
  40.                 Index.ANALYZED));  
  41.         document.add(new Field("size", String.valueOf(file.length()),  
  42.                 Store.YES, Index.NOT_ANALYZED));// 不分词,但是有时需要索引,文件大小(int)转换成String  
  43.         document.add(new Field("path", file.getAbsolutePath(), Store.YES,  
  44.                 Index.NOT_ANALYZED));// 不需要根据文件的路径来查询  
  45.         return document;  
  46.     }  
  47.   
  48.     /** 
  49.      * 读取文件内容 
  50.      *  
  51.      * @param file 
  52.      *            File对象 
  53.      * @return File的内容 
  54.      */  
  55.     private static String readFileContent(File file) {  
  56.         try {  
  57.             BufferedReader reader = new BufferedReader(new InputStreamReader(  
  58.                     new FileInputStream(file)));  
  59.             StringBuffer content = new StringBuffer();  
  60.             try {  
  61.                 for (String line = null; (line = reader.readLine()) != null;) {  
  62.                     content.append(line).append("\n");  
  63.                 }  
  64.             } catch (IOException e) {  
  65.   
  66.                 e.printStackTrace();  
  67.             }  
  68.             return content.toString();  
  69.         } catch (FileNotFoundException e) {  
  70.   
  71.             e.printStackTrace();  
  72.         }  
  73.         return null;  
  74.     }  
  75.   
  76.     /** 
  77.      * <pre> 
  78.      * 获取name属性值的两种方法   
  79.      * 1.Filed field = document.getFiled("name");   
  80.      *         field.stringValue();   
  81.      * 2.document.get("name"); 
  82.      * </pre> 
  83.      *  
  84.      * @param document 
  85.      */  
  86.     public static void printDocumentInfo(Document document) {  
  87.         // TODO Auto-generated method stub  
  88.         System.out.println("name -->" + document.get("name"));  
  89.         System.out.println("content -->" + document.get("content"));  
  90.         System.out.println("path -->" + document.get("path"));  
  91.         System.out.println("size -->" + document.get("size"));  
  92.     }  
  93. }  

 

 

 

HelloLucene01.txt:

Hello, my name is wang xudong, I in iteye blog address is xdwangiflytek.iteye.com.

 

HelloLucene02.txt:

Hello, my name is wang xudong, I in iteye blog address is xdwangiflytek.iteye.com too.

 

HelloLucene03.txt:

iteye too other.

 

 

创建的目录结构为:

 

 

 

运行结果:

 

 

 

分享到:
评论

相关推荐

    Lucene索引器实例

    **Lucene索引器实例详解** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个高级的、灵活的、可扩展的接口,使得开发者能够轻松地在应用程序中实现全文...

    lucene索引查看工具及源码

    在使用 Lucene 进行信息检索时,有时我们需要对建立的索引进行查看、调试或分析,这时就需要借助 Lucene 的索引查看工具。 Luke 是一个非常实用的 Lucene 索引浏览器,全称为 Lucidworks Luke。它允许用户以图形化...

    lucene 索引 查看 工具

    这就是"Lucene 索引 查看 工具"的用途,它可以帮助我们分析和理解 Lucene 索引的工作原理。 主要知识点: 1. **Lucene 索引**:Lucene 的索引是一种倒排索引,它将文档中的词项(tokens)映射到包含这些词项的文档...

    lucene索引查看程序及代码

    《深入理解Lucene索引查看程序与代码》 在信息技术领域,搜索引擎的高效运作离不开底层索引技术的支持,而Lucene作为Apache软件基金会的一个开放源代码项目,正是一个强大的全文检索库,它提供了高效的文本搜索功能...

    深入 Lucene 索引机制

    以下是对Lucene索引机制的详细解析: 一、Lucene的索引过程 1. 文档分析:当向Lucene添加文档时,首先会经过一个分词器(Tokenizer),将文本拆分成一系列的词项(Token)。接着,这些词项会被过滤(Filter)和...

    Lucene索引和查询

    **Lucene索引和查询** Lucene是Apache软件基金会的开放源码全文搜索引擎库,它提供了文本检索的核心工具,使得开发者能够快速构建自己的搜索应用。本项目中的代码旨在展示如何利用Lucene对多个文件夹下的数据进行...

    lucene索引查看工具luck7.4.0

    `Luck`,全称`Luke`,是一款强大的Lucene索引浏览器和分析器工具,可以帮助开发者、数据分析师以及对Lucene感兴趣的人员查看、理解和调试Lucene索引。 `Luke 7.4.0`是这款工具的一个特定版本,它专门设计用来与...

    Lucene索引文件查看工具lukeall4.7.1

    《深入理解Lucene索引文件查看工具LukeAll 4.7.1》 在信息检索领域,Lucene作为一款强大的全文搜索引擎库,被广泛应用在各种数据检索系统中。然而,对于开发者来说,理解并调试Lucene创建的索引文件并非易事。此时...

    Lucene索引查看工具

    lukeall-0.9.jar为Lucene索引查看工具,方便大家查看索引

    Lucene 索引的简单使用

    以上就是关于“Lucene索引的简单使用”的详细介绍,包括其核心概念、创建和查询索引的步骤以及一些高级特性。希望对你理解和应用Lucene有所帮助。在实际开发中,可以根据需求选择合适的Analyzer,优化索引策略,以...

    luke源码--查看lucene索引文件

    《深入理解Luke:洞察Lucene索引文件》 在信息技术领域,搜索引擎的高效运作离不开对数据的快速检索,而Lucene作为开源全文检索库,扮演了核心角色。在这个过程中,Luke工具提供了一种直观的方式,让我们能够查看和...

    lucene索引文件格式介绍

    以下是对Lucene索引文件格式的详细说明。 首先,我们要理解Lucene索引的基本结构。一个Lucene索引位于一个文件夹中,这个文件夹包含了多个段(Segment)。每个段是独立的,包含了一组文档,并且可以与其他段合并。...

    lucene索引结构原理

    **Lucene索引结构原理** Lucene是Apache软件基金会的开放源代码全文搜索引擎库,它为Java开发人员提供了强大的文本搜索功能。理解Lucene的索引结构原理对于优化搜索性能和设计高效的搜索应用至关重要。 首先,我们...

    Lucene索引的基本操作

    **Lucene索引的基本操作** Lucene是一款由Apache软件基金会开发的全文检索库,它提供了高效、可扩展的全文检索功能。在Java开发环境中,Lucene是广泛使用的文本搜索工具,能够帮助开发者构建复杂的搜索引擎。本文将...

    很好的lucene索引查看工具,欢迎各位lucene研究者前来下载

    本文将详细介绍一款被称为“很好的lucene索引查看工具”的实用软件,旨在帮助用户更好地理解和调试Lucene索引。 Lucene索引查看工具是一款专为Lucene设计的可视化工具,它允许用户直观地浏览和分析由Lucene创建的...

    lucene 索引小示例

    《Lucene索引小示例解析》 Lucene是一个高性能、全文检索库,它由Apache软件基金会开发并维护。在Java编程环境中,Lucene被广泛应用于构建搜索功能,特别是对于大量文本数据的高效检索。本篇文章将通过一个简单的小...

    lucene索引查看工具

    这款已经老了,2.4以后的lucene索引用不了。我上传了最新版本的,有需要的话!请到http://download.csdn.net/source/1423241 下。一款可以查看Lucene分词后在索引的排名以及是否有无该词,很多时候用于查看有无需要...

    lucene索引查看工具luke8.0

    luke是一个用于Lucene/Solr/Elasticsearch 搜索引擎,方便开发和诊断的 GUI(可视化)工具。

    lucene索引结构原理.docx

    而在Lucene中,基本单位是Document,它同样由多个字段组成,但Lucene索引的是这些字段的内容,以加速文本检索。 - **索引构建**:Lucene支持增量索引和批量索引,可以处理数据源的小幅变化或大规模数据。数据库通常...

    lucene索引库查看器5.3.0

    《深入理解Lucene索引库查看器5.3.0》 Lucene是一个开源的全文检索库,被广泛应用于各种搜索引擎的开发。在对Lucene进行开发和调试时,一个强大的工具——Lucene索引库查看器(Luke)发挥了至关重要的作用。 Luke ...

Global site tag (gtag.js) - Google Analytics