天天看点

[转]lucene简单实例<一>+<二>(2.0版)

1、在windows系统下的的C盘,建一个名叫s的文件夹,在该文件夹里面随便建三个txt文件,随便起名啦,就叫"1.txt","2.txt"和"3.txt"啦 

其中1.txt的内容如下: 

中华人民共和国   

全国人民   

2006年  

而"2.txt"和"3.txt"的内容也可以随便写几写,这里懒写,就复制一个和1.txt文件的内容一样吧 

2、下载lucene包,放在classpath路径中 

建立索引: 

java代码:

[转]lucene简单实例<一>+<二>(2.0版)

package lighter.javaeye.com;

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

import java.io.BufferedReader;

[转]lucene简单实例<一>+<二>(2.0版)

import java.io.File;

[转]lucene简单实例<一>+<二>(2.0版)

import java.io.FileInputStream;

[转]lucene简单实例<一>+<二>(2.0版)

import java.io.IOException;

[转]lucene简单实例<一>+<二>(2.0版)

import java.io.InputStreamReader;

[转]lucene简单实例<一>+<二>(2.0版)

import java.util.Date;

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

import org.apache.lucene.analysis.Analyzer;

[转]lucene简单实例<一>+<二>(2.0版)

import org.apache.lucene.analysis.standard.StandardAnalyzer;

[转]lucene简单实例<一>+<二>(2.0版)

import org.apache.lucene.document.Document;

[转]lucene简单实例<一>+<二>(2.0版)

import org.apache.lucene.document.Field;

[转]lucene简单实例<一>+<二>(2.0版)

import org.apache.lucene.index.IndexWriter;

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

/**

[转]lucene简单实例<一>+<二>(2.0版)

 * author lighter date 2006-8-7

[转]lucene简单实例<一>+<二>(2.0版)

 */

[转]lucene简单实例<一>+<二>(2.0版)

public class TextFileIndexer {

[转]lucene简单实例<一>+<二>(2.0版)

    public static void main(String[] args) throws Exception {

[转]lucene简单实例<一>+<二>(2.0版)

        /* 指明要索引文件夹的位置,这里是C盘的S文件夹下 */

[转]lucene简单实例<一>+<二>(2.0版)

        File fileDir = new File("c:\\s");

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

        /* 这里放索引文件的位置 */

[转]lucene简单实例<一>+<二>(2.0版)

        File indexDir = new File("c:\\index");

[转]lucene简单实例<一>+<二>(2.0版)

        Analyzer luceneAnalyzer = new StandardAnalyzer();

[转]lucene简单实例<一>+<二>(2.0版)

        IndexWriter indexWriter = new IndexWriter(indexDir, luceneAnalyzer,

[转]lucene简单实例<一>+<二>(2.0版)

                true);

[转]lucene简单实例<一>+<二>(2.0版)

        File[] textFiles = fileDir.listFiles();

[转]lucene简单实例<一>+<二>(2.0版)

        long startTime = new Date().getTime();

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

        //增加document到索引去

[转]lucene简单实例<一>+<二>(2.0版)

        for (int i = 0; i < textFiles.length; i++) {

[转]lucene简单实例<一>+<二>(2.0版)

            if (textFiles[i].isFile()

[转]lucene简单实例<一>+<二>(2.0版)

                    && textFiles[i].getName().endsWith(".txt")) {

[转]lucene简单实例<一>+<二>(2.0版)

                System.out.println("File " + textFiles[i].getCanonicalPath()

[转]lucene简单实例<一>+<二>(2.0版)

                        + "正在被索引

[转]lucene简单实例<一>+<二>(2.0版)

.");

[转]lucene简单实例<一>+<二>(2.0版)

                String temp = FileReaderAll(textFiles[i].getCanonicalPath(),

[转]lucene简单实例<一>+<二>(2.0版)

                        "GBK");

[转]lucene简单实例<一>+<二>(2.0版)

                System.out.println(temp);

[转]lucene简单实例<一>+<二>(2.0版)

                Document document = new Document();

[转]lucene简单实例<一>+<二>(2.0版)

                Field FieldPath = new Field("path", textFiles[i].getPath(),

[转]lucene简单实例<一>+<二>(2.0版)

                        Field.Store.YES, Field.Index.NO);

[转]lucene简单实例<一>+<二>(2.0版)

                Field FieldBody = new Field("body", temp, Field.Store.YES,

[转]lucene简单实例<一>+<二>(2.0版)

                        Field.Index.TOKENIZED,

[转]lucene简单实例<一>+<二>(2.0版)

                        Field.TermVector.WITH_POSITIONS_OFFSETS);

[转]lucene简单实例<一>+<二>(2.0版)

                document.add(FieldPath);

[转]lucene简单实例<一>+<二>(2.0版)

                document.add(FieldBody);

[转]lucene简单实例<一>+<二>(2.0版)

                indexWriter.addDocument(document);

[转]lucene简单实例<一>+<二>(2.0版)

            }

[转]lucene简单实例<一>+<二>(2.0版)

        }

[转]lucene简单实例<一>+<二>(2.0版)

        //optimize()方法是对索引进行优化

[转]lucene简单实例<一>+<二>(2.0版)

        indexWriter.optimize();

[转]lucene简单实例<一>+<二>(2.0版)

        indexWriter.close();

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

        //测试一下索引的时间

[转]lucene简单实例<一>+<二>(2.0版)

        long endTime = new Date().getTime();

[转]lucene简单实例<一>+<二>(2.0版)

        System.out

[转]lucene简单实例<一>+<二>(2.0版)

                .println("这花费了"

[转]lucene简单实例<一>+<二>(2.0版)

                        + (endTime - startTime)

[转]lucene简单实例<一>+<二>(2.0版)

                        + " 毫秒来把文档增加到索引里面去!"

[转]lucene简单实例<一>+<二>(2.0版)

                        + fileDir.getPath());

[转]lucene简单实例<一>+<二>(2.0版)

    }

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

    public static String FileReaderAll(String FileName, String charset)

[转]lucene简单实例<一>+<二>(2.0版)

            throws IOException {

[转]lucene简单实例<一>+<二>(2.0版)

        BufferedReader reader = new BufferedReader(new InputStreamReader(

[转]lucene简单实例<一>+<二>(2.0版)

                new FileInputStream(FileName), charset));

[转]lucene简单实例<一>+<二>(2.0版)

        String line = new String();

[转]lucene简单实例<一>+<二>(2.0版)

        String temp = new String();

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

        while ((line = reader.readLine()) != null) {

[转]lucene简单实例<一>+<二>(2.0版)

            temp += line;

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

        reader.close();

[转]lucene简单实例<一>+<二>(2.0版)

        return temp;

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

}

索引的结果: 

[转]lucene简单实例<一>+<二>(2.0版)

File C:\s\1.txt正在被索引

[转]lucene简单实例<一>+<二>(2.0版)

.

[转]lucene简单实例<一>+<二>(2.0版)

中华人民共和国全国人民2006年

[转]lucene简单实例<一>+<二>(2.0版)

File C:\s\2.txt正在被索引

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

File C:\s\3.txt正在被索引

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

这花费了297 毫秒来把文档增加到索引里面去!c:\s

3、建立了索引之后,查询啦.... 

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

import org.apache.lucene.queryParser.ParseException;

[转]lucene简单实例<一>+<二>(2.0版)

import org.apache.lucene.queryParser.QueryParser;

[转]lucene简单实例<一>+<二>(2.0版)

import org.apache.lucene.search.Hits;

[转]lucene简单实例<一>+<二>(2.0版)

import org.apache.lucene.search.IndexSearcher;

[转]lucene简单实例<一>+<二>(2.0版)

import org.apache.lucene.search.Query;

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

public class TestQuery {

[转]lucene简单实例<一>+<二>(2.0版)

    public static void main(String[] args) throws IOException, ParseException {

[转]lucene简单实例<一>+<二>(2.0版)

        Hits hits = null;

[转]lucene简单实例<一>+<二>(2.0版)

        String queryString = "中华";

[转]lucene简单实例<一>+<二>(2.0版)

        Query query = null;

[转]lucene简单实例<一>+<二>(2.0版)

        IndexSearcher searcher = new IndexSearcher("c:\\index");

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

        Analyzer analyzer = new StandardAnalyzer();

[转]lucene简单实例<一>+<二>(2.0版)

        try {

[转]lucene简单实例<一>+<二>(2.0版)

            QueryParser qp = new QueryParser("body", analyzer);

[转]lucene简单实例<一>+<二>(2.0版)

            query = qp.parse(queryString);

[转]lucene简单实例<一>+<二>(2.0版)

        } catch (ParseException e) {

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

        if (searcher != null) {

[转]lucene简单实例<一>+<二>(2.0版)

            hits = searcher.search(query);

[转]lucene简单实例<一>+<二>(2.0版)

            if (hits.length() > 0) {

[转]lucene简单实例<一>+<二>(2.0版)

                System.out.println("找到:" + hits.length() + " 个结果!");

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

其运行结果: 

[转]lucene简单实例<一>+<二>(2.0版)

找到:3 个结果!

[转]lucene简单实例<一>+<二>(2.0版)

具体的API的用法,这里就不说了,具体的做法参考lucene的官方文档吧... 

注:lucene2.0的API 与lucene1.4.3的API 有了一些区别. (例子中用到的)

这是lucene2.0的API 

[转]lucene简单实例<一>+<二>(2.0版)

 QueryParser qp = new QueryParser("body", analyzer);   

[转]lucene简单实例<一>+<二>(2.0版)

 query = qp.parse(queryString);   

这是lucene1.4.3版的API 

[转]lucene简单实例<一>+<二>(2.0版)

 query = QueryParser.parse(key,queryString,new new StandardAnalyzer());

================================

搜索篇:lucene的简单实例<二> 

写文章的时候,感觉比较难写的就是标题,有时候不知道起什么名字好,反正这里写的都是关于lucene的一些简单的实例,就随便起啦. 

Lucene 其实很简单的,它最主要就是做两件事:建立索引和进行搜索 

来看一些在lucene中使用的术语,这里并不打算作详细的介绍,只是点一下而已----因为这一个世界有一种好东西,叫搜索。 

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

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

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

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

Field:字段。 

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

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

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

Hits:在搜索完成之后,需要把搜索结果返回并显示给用户,只有这样才算是完成搜索的目的。在lucene中,搜索的结果的集合是用Hits类的实例来表示的。 

上面作了一大堆名词解释,下面就看几个简单的实例吧: 

1、简单的的StandardAnalyzer测试例子 

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

import java.io.StringReader;

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

import org.apache.lucene.analysis.Token;

[转]lucene简单实例<一>+<二>(2.0版)

import org.apache.lucene.analysis.TokenStream;

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

public class StandardAnalyzerTest 

[转]lucene简单实例<一>+<二>(2.0版)

{

[转]lucene简单实例<一>+<二>(2.0版)

    //构造函数,

[转]lucene简单实例<一>+<二>(2.0版)

    public StandardAnalyzerTest()

[转]lucene简单实例<一>+<二>(2.0版)

    {

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

    public static void main(String[] args) 

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

        //生成一个StandardAnalyzer对象

[转]lucene简单实例<一>+<二>(2.0版)

        Analyzer aAnalyzer = new StandardAnalyzer();

[转]lucene简单实例<一>+<二>(2.0版)

        //测试字符串

[转]lucene简单实例<一>+<二>(2.0版)

        StringReader sr = new StringReader("lighter javaeye com is the are on");

[转]lucene简单实例<一>+<二>(2.0版)

        //生成TokenStream对象

[转]lucene简单实例<一>+<二>(2.0版)

        TokenStream ts = aAnalyzer.tokenStream("name", sr);    

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

            int i=0;

[转]lucene简单实例<一>+<二>(2.0版)

            Token t = ts.next();

[转]lucene简单实例<一>+<二>(2.0版)

            while(t!=null)

[转]lucene简单实例<一>+<二>(2.0版)

            {

[转]lucene简单实例<一>+<二>(2.0版)

                //辅助输出时显示行号

[转]lucene简单实例<一>+<二>(2.0版)

                i++;

[转]lucene简单实例<一>+<二>(2.0版)

                //输出处理后的字符

[转]lucene简单实例<一>+<二>(2.0版)

                System.out.println("第"+i+"行:"+t.termText());

[转]lucene简单实例<一>+<二>(2.0版)

                //取得下一个字符

[转]lucene简单实例<一>+<二>(2.0版)

                t=ts.next();

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

        } catch (IOException e) {

[转]lucene简单实例<一>+<二>(2.0版)

            e.printStackTrace();

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

显示结果:

[转]lucene简单实例<一>+<二>(2.0版)

第1行:lighter 

[转]lucene简单实例<一>+<二>(2.0版)

第2行:javaeye 

[转]lucene简单实例<一>+<二>(2.0版)

第3行:com

[转]lucene简单实例<一>+<二>(2.0版)

提示一下: 

StandardAnalyzer是lucene中内置的"标准分析器",可以做如下功能: 

1、对原有句子按照空格进行了分词 

2、所有的大写字母都可以能转换为小写的字母 

3、可以去掉一些没有用处的单词,例如"is","the","are"等单词,也删除了所有的标点 

查看一下结果与"new StringReader("lighter javaeye com is the are on")"作一个比较就清楚明了。 

这里不对其API进行解释了,具体见lucene的官方文档。需要注意一点,这里的代码使用的是lucene2的API,与1.43版有一些明显的差别。 

2、看另一个实例,简单地建立索引,进行搜索 

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

import org.apache.lucene.store.FSDirectory;

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

public class FSDirectoryTest {

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

    //建立索引的路径

[转]lucene简单实例<一>+<二>(2.0版)

    public static final String path = "c:\\index2";

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

        Document doc1 = new Document();

[转]lucene简单实例<一>+<二>(2.0版)

        doc1.add( new Field("name", "lighter javaeye com",Field.Store.YES,Field.Index.TOKENIZED));

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

        Document doc2 = new Document();

[转]lucene简单实例<一>+<二>(2.0版)

        doc2.add(new Field("name", "lighter blog",Field.Store.YES,Field.Index.TOKENIZED));

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

        IndexWriter writer = new IndexWriter(FSDirectory.getDirectory(path, true), new StandardAnalyzer(), true);

[转]lucene简单实例<一>+<二>(2.0版)

        writer.setMaxFieldLength(3);

[转]lucene简单实例<一>+<二>(2.0版)

        writer.addDocument(doc1);

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

        writer.addDocument(doc2);

[转]lucene简单实例<一>+<二>(2.0版)

        writer.close();

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

        IndexSearcher searcher = new IndexSearcher(path);

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

        QueryParser qp = new QueryParser("name",new StandardAnalyzer());

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

        query = qp.parse("lighter");

[转]lucene简单实例<一>+<二>(2.0版)

        hits = searcher.search(query);

[转]lucene简单实例<一>+<二>(2.0版)

        System.out.println("查找\"lighter\" 共" + hits.length() + "个结果");

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

        query = qp.parse("javaeye");

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

        System.out.println("查找\"javaeye\" 共" + hits.length() + "个结果");

[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)
[转]lucene简单实例<一>+<二>(2.0版)

运行结果: 

[转]lucene简单实例<一>+<二>(2.0版)

查找"lighter" 共2个结果

[转]lucene简单实例<一>+<二>(2.0版)

查找"javaeye" 共1个结果

上一篇: LintCode: 3 Sum