刚开始做全文检索也是找了很多资料但是网上的都不是很齐全luence是个很不多的工具

Lucene4.0的官网文档:http://lucene.apache.org/core/4_0_0/core/overview-summary.html

这个工具跟新很快很多风格不一样比如,以前版本的申请IndexWriter时,是这样的:

  1. IndexWriter indexWriter = new IndexWriter(indexDir,luceneAnalyzer, true );
    但是4.0,我们需要配置一个conf,把配置内容放到这个对象中:
  1. IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_CURRENT, analyzer);
  2. IndexWriter iwriter = new IndexWriter(directory, config);
  3.  
  4. 这是其中最常用的五个文件:

  第一个,也是最重要的,Lucene-core-4.0.0.jar,其中包括了常用的文档,索引,搜索,存储等相关核心代码。

  1.  

  第二个,Lucene-analyzers-common-4.0.0.jar,这里面包含了各种语言的词法分析器,用于对文件内容进行关键字切分,提取。

  1.  

  第三个,Lucene-highlighter-4.0.0.jar,这个jar包主要用于搜索出的内容高亮显示。

  1.  

  第四个和第五个,Lucene-queryparser-4.0.0.jar,提供了搜索相关的代码,用于各种搜索,比如模糊搜索,范围搜索,等等。

  1.  
  1. 什么是全文检索
    比如,我们一个文件夹中,或者一个磁盘中有很多的文件,记事本、worldExcelpdf,我们想根据其中的关键词搜索包含的文件。
    例如,我们输入Lucene,所有内容含有Lucene的文件就会被检查出来。这就是所谓的全文检索。
  2.  
  3. Lucene的使用主要体现在两个步骤:

  1 创建索引,通过IndexWriter对不同的文件进行索引的创建,并将其保存在索引相关文件存储的位置中。

  1.  

  2 通过索引查寻关键字相关文档。

  1. 下面针对官网上面给出的一个例子,进行分析:
  1. 1   Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);
  2. 2
  3. 3 // Store the index in memory:
  4. 4 Directory directory = new RAMDirectory();
  5. 5 // To store an index on disk, use this instead:
  6. 6 //Directory directory = FSDirectory.open("/tmp/testindex");
  7. 7 IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_CURRENT, analyzer);
  8. 8 IndexWriter iwriter = new IndexWriter(directory, config);
  9. 9 Document doc = new Document();
  10. 10 String text = "This is the text to be indexed.";
  11. 11 doc.add(new Field("fieldname", text, TextField.TYPE_STORED));
  12. 12 iwriter.addDocument(doc);
  13. 13 iwriter.close();
  14. 14
  15. 15 // Now search the index:
  16. 16 DirectoryReader ireader = DirectoryReader.open(directory);
  17. 17 IndexSearcher isearcher = new IndexSearcher(ireader);
  18. 18 // Parse a simple query that searches for "text":
  19. 19 QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, "fieldname", analyzer);
  20. 20 Query query = parser.parse("text");
  21. 21 ScoreDoc[] hits = isearcher.search(query, null, 1000).scoreDocs;
  22. 22 assertEquals(1, hits.length);
  23. 23 // Iterate through the results:
  24. 24 for (int i = 0; i < hits.length; i++) {
  25. 25 Document hitDoc = isearcher.doc(hits[i].doc);
  26. 26 assertEquals("This is the text to be indexed.", hitDoc.get("fieldname"));
  27. 27 }
  28. 28 ireader.close();
  29. 29 directory.close();
  1.  

  

  1.  

索引的创建

  1.  

  首先,我们需要定义一个词法分析器。

  1.  

  比如一句话,“我爱我们的中国!”,如何对他拆分,扣掉停顿词“的”,提取关键字“我”“我们”“中国”等等。这就要借助的词法分析器Analyzer来实现。这里面使用的是标准的词法分析器,如果专门针对汉语,还可以搭配paoding,进行使用。

  1.  
  1. 1 Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);
  1.  

  参数中的Version.LUCENE_CURRENT,代表使用当前的Lucene版本,本文环境中也可以写成Version.LUCENE_40。

  1.  

  

  1.  

  第二步,确定索引文件存储的位置,Lucene提供给我们两种方式:

  1.  

  1 本地文件存储

  1.  
  1. Directory directory = FSDirectory.open("/tmp/testindex");
  1.  

  2 内存存储

  1.  
  1. Directory directory = new RAMDirectory();
  1.  

  可以根据自己的需要进行设定。

  1.  

   

  1.  

  第三步,创建IndexWriter,进行索引文件的写入。

  1.  
  1. IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_CURRENT, analyzer);
  2. IndexWriter iwriter = new IndexWriter(directory, config);
  1.  

  这里的IndexWriterConfig,据官方文档介绍,是对indexWriter的配置,其中包含了两个参数,第一个是目前的版本,第二个是词法分析器Analyzer。

  1.  

  

  1.  

  第四步,内容提取,进行索引的存储。

  1.  
  1. Document doc = new Document();
  2. String text = "This is the text to be indexed.";
  3. doc.add(new Field("fieldname", text, TextField.TYPE_STORED));
  4. iwriter.addDocument(doc);
  5. iwriter.close();
  1.  

  第一行,申请了一个document对象,这个类似于数据库中的表中的一行。

  1.  

  第二行,是我们即将索引的字符串。

  1.  

  第三行,把字符串存储起来(因为设置了TextField.TYPE_STORED,如果不想存储,可以使用其他参数,详情参考官方文档),并存储“表明”为"fieldname".

  1.  

  第四行,把doc对象加入到索引创建中。

  1.  

  第五行,关闭IndexWriter,提交创建内容。

  1.  

  

  1.  

  这就是索引创建的过程。

  1.  

关键字查询:

  1.  

  第一步,打开存储位置

  1.  
  1. DirectoryReader ireader = DirectoryReader.open(directory);
  1.  

  第二步,创建搜索器

  1.  
  1. IndexSearcher isearcher = new IndexSearcher(ireader);
  1.  

  第三步,类似SQL,进行关键字查询

  1.  
  1. QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, "fieldname", analyzer);
  2. Query query = parser.parse("text");
  3. ScoreDoc[] hits = isearcher.search(query, null, 1000).scoreDocs;
  4. assertEquals(1, hits.length);
  5. for (int i = 0; i < hits.length; i++) {
  6. Document hitDoc = isearcher.doc(hits[i].doc);
  7. assertEquals("This is the text to be indexed.",hitDoc.get("fieldname"));
  8. }
  1.  

  这里,我们创建了一个查询器,并设置其词法分析器,以及查询的“表名“为”fieldname“。查询结果会返回一个集合,类似SQL的ResultSet,我们可以提取其中存储的内容。

  1.  

  关于各种不同的查询方式,可以参考官方手册,或者推荐的PPT

  1.  

  第四步,关闭查询器等。

  1.  
  1. ireader.close();
  2. directory.close();
  1.  

luence全文检索(简介)的更多相关文章

  1. luence全文检索(数据库检索)

    注解:从数据库中查询所有数据然后放入luence中,然后在luence来检索 package com.zhu.demo; import java.io.IOException; import java ...

  2. 大型运输行业实战_day15_1_全文检索之Lucene

    1.引入 全文检索简介: 非结构化数据又一种叫法叫全文数据.从全文数据(文本)中进行检索就叫全文检索. 2.数据库搜索的弊端 案例 :     select  *  from product  whe ...

  3. Lucene8.5.x全文检索工具

    本文的资源展示: hotword:是热词的文本,比如不是词语的中文,但是是什么人名或者公司名称的词语,需要分词成一个词语的将需要的加入hotword.dic stopword:无意义的词放入的词典,或 ...

  4. 收藏的技术文章链接(ubuntu,python,android等)

    我的收藏 他山之石,可以攻玉 转载请注明出处:https://ahangchen.gitbooks.io/windy-afternoon/content/ 开发过程中收藏在Chrome书签栏里的技术文 ...

  5. Lucene:基于Java的全文检索引擎简介

    Lucene:基于Java的全文检索引擎简介 Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引/检索引擎--Lucene Lucene不是一个完整的全文索引应用,而是是一个用J ...

  6. Lucene:基于Java的全文检索引擎简介 (zhuan)

    http://www.chedong.com/tech/lucene.html ********************************************** Lucene是一个基于Ja ...

  7. 分布式全文检索系统SolrCloud简介

    前言 本文简单描述SolrCloud的特性,基本结构和入门,基于Solr4.5版本. Lucene是一个Java语言编写的利用倒排原理实现的文本检索类库.Solr是以Lucene为基础实现的文本检索应 ...

  8. JAVAEE——Lucene基础:什么是全文检索、Lucene实现全文检索的流程、配置开发环境、索引库创建与管理

    1. 学习计划 第一天:Lucene的基础知识 1.案例分析:什么是全文检索,如何实现全文检索 2.Lucene实现全文检索的流程 a) 创建索引 b) 查询索引 3.配置开发环境 4.创建索引库 5 ...

  9. (转)全文检索技术学习(二)——配置Lucene的开发环境

    http://blog.csdn.net/yerenyuan_pku/article/details/72589380 Lucene下载 Lucene是开发全文检索功能的工具包,可从官方网站http: ...

随机推荐

  1. assert.deepStrictEqual()

    assert.deepStrictEqual(actual, expected[, message]) 一般情况下等同于 assert.deepEqual(),但有两个例外.首先,原始值是使用全等运算 ...

  2. 读书笔记:《人有人的用处》------N.维纳. (2016.12.28)

    读书笔记:<人有人的用处>------N.维纳 ·某些系统可以依其总能量而和其他系统区别开来. ·在某些情况下,一个系统如果保持足够长时间的运转,那它就会遍历一切与其能量相容的位置和动量的 ...

  3. 使用java发送电子邮件

    经常在账号绑定邮箱或找回密码时,邮箱会收到一条验证邮件,好奇用代码该怎么发送邮件,看到了许多相关的博客,实现步骤都写的很详细,今天照着其他博客的步骤也确实实现了代码发送邮件,在这里重新记录下步骤,加深 ...

  4. SPOJ GSS6 Can you answer these queries VI

    Can you answer these queries VI Time Limit: 2000ms Memory Limit: 262144KB This problem will be judge ...

  5. SPOJ ARCTAN

    POJ1183 除输入方式外与这道题完全一样 题目大意是给定一个a 求最小的满足arctan(1/A)=arctan(1/B)+arctan(1/C) 的B+C的最小值 根据上述递推规律,我们只要从2 ...

  6. [NOIP2004] 提高组 洛谷P1089 津津的储蓄计划

    题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里 ...

  7. 2015山东信息学夏令营 Day4T3 生产

    2015山东信息学夏令营 Day4T3 生产 [题目描述] 工厂为了生产一种复杂的产品,给各个生产部门制定了详细的生产计划.那么,就经常会有生产部门要把产品送到另一个生产部门作为原料.这是一个注重产品 ...

  8. 单调队列&单调栈 基础

    参考博客https://www.cnblogs.com/tham/p/8038828.html 例题  poj 2823 Sliding Window Time Limit: 12000MS   Me ...

  9. Ionic3错误记录:navigation stack needs at least one root page

    BUG场景:在 ActionSheetController 使用modalCtrl.create 创建模态框时报如下错误 原代码片段 解决方式: 重新设置root page

  10. SaltStack学习系列之自定义grains

    Master端 打开存放自定义grains的目录 vim /etc/salt/master file_roots: base: - /srv/salt/ 建立自定义模块 cd /srv/salt mk ...