Lucene 安装和应用实战

Posted 悦码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lucene 安装和应用实战相关的知识,希望对你有一定的参考价值。

              lucene的组成结构

对于外部应用来说索引模块(index)和检索模块(search)是主要的外部应用入口。

           索引过程

从命令行读取文件名(多个),将文件分路径(path字段)和内容(body字段)2个字段进行存储,并对内容进行全文索引。索引的单位是Document对象,每个Document对象包含多个字段Field对象,针对不同的字段属性和数据输出的需求,对字段还可以选择不同的索引/存储字段规则,列表如下:

看下面的一个简单的 Lucene 搜索程序:

public class IndexFiles {

  //使用方法:: IndexFiles [索引输出目录] [索引的文件列表] ...

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

        String indexPath = args[0];

        IndexWriter writer;

        //用指定的语言分析器构造一个新的写索引器(第3个参数表示是否为追加索引)

        writer = new IndexWriter(indexPath, new SimpleAnalyzer(), false);

        for (int i=1; i<args.length; i++) {

            System.out.println("Indexing file " + args[i]);

            InputStream is = new FileInputStream(args[i]);

            //构造包含2个字段Field的Document对象

            //一个是路径path字段,不索引,只存储

            //一个是内容body字段,进行全文索引,并存储

            Document doc = new Document();

            doc.add(Field.UnIndexed("path", args[i]));

            doc.add(Field.Text("body", (Reader) new InputStreamReader(is)));

            //将文档写入索引

            writer.addDocument(doc);

            is.close();

        };

        //关闭写索引器

        writer.close();

    }

}

上面是一个创建索引的过程,索引过程中可以看到:

  • 语言分析器提供了抽象的接口,因此语言分析(Analyser)是可以定制的,虽然lucene缺省提供了2个比较通用的分析器SimpleAnalyser和StandardAnalyser,这2个分析器缺省都不支持中文,所以要加入对中文语言的切分规则,需要修改这2个分析器。

  • Lucene并没有规定数据源的格式,而只提供了一个通用的结构(Document对象)来接受索引的输入,因此输入的数据源可以是:数据库,WORD文档,PDF文档,html文档……只要能够设计相应的解析转换器将数据源构造成成Docuement对象即可进行索引。

  • 对于大批量的数据索引,还可以通过调整IndexerWrite的文件合并频率属性(mergeFactor)来提高批量索引的效率。

           检索过程

搜索结果返回的是Hits对象,可以通过它再访问Document==>Field中的内容。

假设根据body字段进行全文检索,可以将查询结果的path字段和相应查询的匹配度(score)打印出来。看下面的一个搜索案例:

public class Search {

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

        String indexPath = args[0], queryString = args[1];

        //指向索引目录的搜索器

        Searcher searcher = new IndexSearcher(indexPath);

        //查询解析器:使用和索引同样的语言分析器

        Query query = QueryParser.parse(queryString, "body",

                                  new SimpleAnalyzer());

        //搜索结果使用Hits存储

        Hits hits = searcher.search(query);

        //通过hits可以访问到相应字段的数据和查询的匹配度

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

          System.out.println(hits.doc(i).get("path") + "; Score: " +

                             hits.score(i));

        };

    }

}

在整个检索过程中,语言分析器,查询分析器,甚至搜索器(Searcher)都是提供了抽象的接口,可以根据需要进行定制。

上面简单的百把行代码,就实现了一个 Lucene 检索应用。但是实际使用过程中,还有很多的需求和功能,例如:对内容修改了呢?还有对搜索结果的排序,人工排序,权重干扰,索引优化,分布式等。后面我们继续深入学习!

以上是关于Lucene 安装和应用实战的主要内容,如果未能解决你的问题,请参考以下文章

Lucene 实战(第2版)

资料下载《Lucene实战 第2版》

实战 Lucene,第 1 部分: 初识 Lucene (zhuan)

超级好看的大数据电子书分享《从Lucene到Elasticsearch:全文检索实战》

电子书 Lucence实战中文版第2版.pdf

LuceneApache Lucene全文检索引擎架构之入门实战1