版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://dreamhead.blogbus.com/logs/13442877.html

Lucene是什么?下面是官方回答。

Apache Lucene is a high-performance, full-featured text search engine library written entirely in Java.

简而言之,它是用来做搜索的库。提及搜索,我们的思绪就会情不自禁飞到串匹配上。没错,串匹配确实是一种搜索,但对于不同的应用,搜索的方法不一样,对于在一篇文档中进行搜索这种小规模应用而言,串匹配足够了,而Lucene为我们向大规模搜索铺上了一条大道。大规模?是不是想到了搜索引擎,事实上,Lucene就是被很多人用来构建搜索引擎。

关于搜索引擎的实现,很多人或多或少的听说过一些,比如网络爬虫,比如分布式的架构,比如PageRank。抛开其它其它复杂的部分,最关键的步骤便是建立索引,然后进行搜索。不妨让我们Lucene是如何实现这最关键的部分。

import java.io.File;
import java.io.FileReader;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;

public class Indexer {
    public static void main(String[] args) throws Exception {
        File indexDir = new File("index");
        File dataDir = new File("data");

IndexWriter indexWriter = null;
        try {
            indexWriter = new IndexWriter(indexDir, new StandardAnalyzer(), true);
            for (File file : dataDir.listFiles()) {
                if (file.isFile() && file.getName().endsWith(".txt")) {
                    Document document = new Document();
                    Field pathField = new Field("path", file.getCanonicalPath(),
                        Field.Store.YES, Field.Index.TOKENIZED);
                    document.add(pathField);
                    Field contentField = new Field("contents", new FileReader(file));
                    document.add(contentField);
                    indexWriter.addDocument(document);
                }
            }
            indexWriter.optimize();
        } finally {
            if (indexWriter != null) {
                indexWriter.close();
            }
        }
    }
}

这段代码很容易理解,遍历数据目录下的文本文件,为每个文件生成索引。

这里有一个Document的概念,它在Lucene表示的是索引和搜索的单位,也就是说,建立索引,是以Document为单位的,搜索也是以Document为单位的。Document中有一堆的Field,我们可以把它们理解为Document中一个一个小节。有了Field,我们可以为Document添加一些属性,比如这里,我们就添加了路径(path)和内容(content)两个属性。这样,搜索之后,我们可以利用这些属性提供更多的信息,比如,告诉别人搜索的词出现在哪个文档中。

上面的代码中,我们可以清楚看到,建立Document,并向其中插入Field的过程。有了Document,我们就可以把它借助IndexWriter将它们写入索引中,至于最后的optimize,显然是为了让搜索更有效率而存在的。

有了索引,那就该进行下一步的工作,搜索。

import org.apache.lucene.document.Document;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;

public class Searcher {
    public static void main(String[] args) throws Exception {
        String type = "contents";
        String key = "game";
        String path = "index";
        
        IndexSearcher searcher = new IndexSearcher(path);
        Term t = new Term(type, key);
        Query query = new TermQuery(t);

Hits hits = searcher.search(query);
        for(int i = 0; i < hits.length(); i++){
            Document document = hits.doc(i);
            System.out.println("File: " + document.get("path"));
        }
    }
}

IndexSearcher是用来在索引中进行搜索主要帮手,前提是我们要告诉它到索引在哪。Term表示文本中的一个词,它说明了我们要在哪个Field(type)中找什么(key)。然后,我们用Term做成一个Query,表示我们要进行搜索了。做好准备,接下来,就是搜索了。搜索的结果叫做Hits。遍历这个Hits,便可以将搜索结果一一展示出来。如前面所说,这里利用路径这个属性报告搜索的结果。

有了Lucene做基础,能做的事就很多了,比如搭建一个搜索引擎。事实上,已经有了这样的开源项目,比如与Lucene同出一门的Nutch,比如比Nutch年纪更大的Compass。

Hello, Lucene相关推荐

  1. 2021年大数据ELK(四):Lucene的美文搜索案例

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 美文搜索案例 一.需求 二.准备工作 1.创建IDEA项目 2. ...

  2. 2021年大数据ELK(三):Lucene全文检索库介绍

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 一.什么是全文检索 1.结构化数据与非结构化数据 2.搜索结构化 ...

  3. lucene.net mysql_用Lucene[1].net对数据库建立索引及搜索+

    cs代码 using System; using System.Collections; using System.ComponentModel; using System.Data; using S ...

  4. lucene构建同义词分词器

    lucene4.0版本号以后 已经用TokenStreamComponents 代替了TokenStream流.里面包含了filter和tokenizer 在较复杂的lucene搜索业务场景下,直接网 ...

  5. 影响Lucene索引速度原因以及提高索引速度技巧

    在网上看了一篇外文文章,里面介绍了提高Lucene索引速度的技巧,分享给大家. 先来看下影响索引的主要因素: MaxMergeDocs 该参数决定写入内存索引文档个数,到达该数目后就把该内存索引写入硬 ...

  6. Lucene.net中文分词探究

    一.中文分词方式: 中文分词几种常用的方式: A. 单字分词 单字分词,顾名思义,就是按照中文一个字一个字地进行分词.如:我们是中国人,效果:我/们/是/中/国/人. B. 二分法 二分法,就是按两个 ...

  7. 【Java】Lucene检索引擎详解

    基于Java的全文索引/检索引擎--Lucene Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能. L ...

  8. Lucene:基于Java的全文检索引擎简介(转载)

    Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 全文检索的实现:Luene全文索引和数据库索引的比较 中文切分词机制简介:基 ...

  9. Lucene.net: the main concepts

    2019独角兽企业重金招聘Python工程师标准>>> In the previous post you learnt how to get a copy of Lucene.net ...

  10. Lucene.Net无障碍学习和使用:索引篇

    项目中可能需要再次用到Lucene.Net,利用空闲时间写了个demo,主要涉及到索引的创建.删除.更新和一个简单查询.在本文示例中,Lucene.Net的版本是2.4.0,某些类和方法与最新版本或者 ...

最新文章

  1. 阿里某程序员爆料:面试一个重庆小伙子,却被对方微信调戏!
  2. int * const a, 和 const int* a,const PInt a;
  3. msys2 安装注意事项
  4. Lock 与 InterruptedException
  5. Laravel - Artisan 个人常用总结
  6. Facebook解释“宕机”原因:主干路由器配置变化致通信中断,未发现用户数据受影响...
  7. Java中的日期操作
  8. [css] 你有使用过字体图标吗?它有什么好处?
  9. 前端学习(574):margin无效情形之绝对定位下的非定义的方向“无效”
  10. 不同文件类型输出及ContentType表
  11. char 转wchar_t 及wchar_t转char
  12. css怎么更改指定字体颜色,CSS-如何更改禁用输入的字体颜色?
  13. 【JVM】三色标记法与读写屏障
  14. javaweb实训第六天上午——JSONSpringMVC进阶
  15. python表白代码-520使用Python实现quot;我爱你”表白
  16. dcp1608w电脑通过_dcp-1608打印机驱动程序
  17. 社区说|Flutter 主流状态管理框架 provider get 分析
  18. 关于认知升级的思考-认知升级是深度思考、认知升级是探索未知
  19. __attribute__((__aligned__(n)))对结构体对齐的影响
  20. requests+python+unitte实现接口测试回归

热门文章

  1. PropTypes使用
  2. 基于Python实现随机车牌号程序
  3. AFNetworking网络请求失败
  4. 开发中,模拟器网络请求成功,真机网络请求失败
  5. 在WORD中显示代码的格式
  6. 湘南学院计算机系考研喜报,湘南学院考研都考什么学校通过率高不高--【天道考研网校】(网络考研辅导班首选)...
  7. matlab中吃蛋问题,张文宏再次强调要多吃鸡蛋,减脂期怎么吃鸡蛋热量最低,看看吧!...
  8. 使用微信开放标签wx-open-launch-app实现从h5跳转至app
  9. ES6 之 for-of 以及 生成器
  10. css+html鲸鱼网页代码