Lucene全文检索初识

Lucene 简述

Lucene是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。

数据可以三种:

  • 结构化数据(具有固定格式或有限长度的数据)
  • 非结构化数据
  • 半结构化数据

对于结构化数据一般使用SQL语句查询,而非结构化数据有顺序扫描和全文检索。



Lucene 文件结构

层次结构:索引 -> 段 -> 文档 -> 域 -> 词

文档是Lucene索引和搜索的原子单位,文档为包括一个或多个域的容器,域则真正包括被搜索的内容,域值通过分词技术处理,得到多个词元。



Lucene 索引创建

创建索引的三步:需要检索的数据(Document)、分词技术(Analyzer)、索引创建(indexer)

//创建索引关键类
//IndexWrite
IndexWrite indexWrite=new IndexWrite(directory,indexWriteConfig);
//Directory
Directory directory=FSDirectory.open(new File("C://index));
//Analyzer  创建标准分词器
Analyzer analyzer=new StandardAnalyzer(Version.LUCENE_43);
//Document
Document doc=new Document();
//Filed
doc.add(new TextField("filedname","测试",Store.YES));

Java实现索引创建

package com.lucene;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

import java.io.File;
import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 * User: YEN
 * Date: 2016/8/17
 * Time: 08:26
 */

/**
 * 索引创建
 */
public class IndexCreate {
    public static void main(String[] args) throws IOException {
        //指定分词技术,这里使用的是标准分词
        Analyzer analyzer=new StandardAnalyzer(Version.LUCENE_43);
        //indexWriter的配置信息
        IndexWriterConfig indexWriterConfig=new IndexWriterConfig(Version.LUCENE_43,analyzer);
        //索引的打开方式:没有就创建,有就打开
        indexWriterConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
        Directory directory=null;
        IndexWriter indexWriter=null;
        try{
            //确定索引文件的位置 这里是本地文件存储
            directory= FSDirectory.open(new File("C://index"));
            //如果索引处于锁定状态就解锁
            if(indexWriter.isLocked(directory)){
                indexWriter.unlock(directory);
            }
            //指定索引的操作对象为indexWrite
            indexWriter = new IndexWriter(directory, indexWriterConfig);

        }catch ( Exception e ){
            e.printStackTrace();
        }finally {
            indexWriter.close();
            directory.close();
        }

        Document doc1=new Document();
        //StringField域
        doc1.add(new StringField("id","abc", Field.Store.YES));
        //TextField域,采用指定的分词技术
        doc1.add(new TextField("content","Lucene测试", Field.Store.YES));
        //IntField域
        doc1.add(new IntField("num",1, Field.Store.YES));
        //将文档写入到索引中
        indexWriter.addDocument(doc1);

        indexWriter.commit();
    }
}



Lucene 索引检索

索引检索的四步:搜索关键字(Keywords)、分词技术(Analyzer)、检索索引(Search)、返回结果。

java实现索引检索

package com.lucene;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

import java.io.File;
import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 * User: YEN
 * Date: 2016/8/17
 * Time: 08:42
 */
public class IndexSearch {
    public static void main(String[] args) {
        Directory directory=null;
        try {
            //索引硬盘存储路径
            directory= FSDirectory.open(new File("C://index"));
            //读取索引
            DirectoryReader directoryReader=DirectoryReader.open(directory);
            //创建索引检索对象
            IndexSearcher search=new IndexSearcher(directoryReader);
            //分词技术
            Analyzer analyzer=new StandardAnalyzer(Version.LUCENE_43);
            //创建Query
            QueryParser parser=new QueryParser(Version.LUCENE_43,"content",analyzer);
            Query query=parser.parse("Lucene案例");
            //检索索引,获取符合条件的前10条记录
            TopDocs topDocs=search.search(query,10);
            if(null!=topDocs){
                System.out.println(topDocs.totalHits);
                for ( int i = 0; i < topDocs.scoreDocs.length; i++ ) {
                    Document doc=search.doc(topDocs.scoreDocs[i].doc);
                    System.out.println("id="+doc.get("id"));
                    System.out.println("content="+doc.get("content"));
                }
            }
            directory.close();
            directoryReader.close();
        } catch ( IOException e ) {
            e.printStackTrace();
        } catch ( ParseException e ) {
            e.printStackTrace();
        }
    }
}


Lucene 分词器

常用分词器:

  • StandardAnalyzer 标准分词器
  • IKAnalyzer 基于Lucene的第三方中文分词技术
  • WritespaceAnalyzer 空格分词器
  • SimpleAnalyzer 简单分词器
  • CJKAnalyzer 二分法分词器
  • KeywordAnalyzer 关键词分词器
  • StopAnalyzer 被忽略词分词器
package com.lucene;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.analysis.core.KeywordAnalyzer;
import org.apache.lucene.analysis.core.SimpleAnalyzer;
import org.apache.lucene.analysis.core.StopAnalyzer;
import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;

import java.io.IOException;
import java.io.StringReader;

/**
 * Created with IntelliJ IDEA.
 * User: YEN
 * Date: 2016/8/17
 * Time: 08:57
 */
public class AnalyzerDemo {
    private static String str="Lucene案例开发";

    public static void main(String[] args) {
        //定义分词器对象
        Analyzer analyzer=null;
        analyzer=new StandardAnalyzer(Version.LUCENE_43);
        AnalyzerDemo.Show(analyzer);
        System.out.println("\n....................................");
        AnalyzerDemo.Show(new IKAnalyzer());
        System.out.println("\n....................................");
        AnalyzerDemo.Show(new WhitespaceAnalyzer(Version.LUCENE_43));
        System.out.println("\n....................................");
        AnalyzerDemo.Show(new SimpleAnalyzer(Version.LUCENE_43));
        System.out.println("\n....................................");
        AnalyzerDemo.Show(new CJKAnalyzer(Version.LUCENE_43));
        System.out.println("\n....................................");
        AnalyzerDemo.Show(new KeywordAnalyzer());
        System.out.println("\n....................................");
        AnalyzerDemo.Show(new StopAnalyzer(Version.LUCENE_43));
    }

    //输出分词结果
    public static void Show(Analyzer analyzer){
        StringReader stringReader=new StringReader(str);
        try {
            TokenStream tokenStream=analyzer.tokenStream("",stringReader);
            tokenStream.reset();
            CharTermAttribute termAttribute=tokenStream.getAttribute(CharTermAttribute.class);
            System.out.println("分词技术:"+analyzer.getClass());
            while ( tokenStream.incrementToken() ){
                System.out.print(termAttribute.toString()+"|");
            }

        } catch ( IOException e ) {
            e.printStackTrace();
        }
    }

}

时间: 2024-10-14 00:01:56

Lucene全文检索初识的相关文章

jQuery、HTML5、Spring Security安全权限、Lucene全文检索

获取[下载地址]   QQ: 313596790   [免费支持更新]支持三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体[新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统]A 代码生成器(开发利器);      增删改查的处理类,service层,mybatis的xml,SQL( mysql   和oracle)脚本,   jsp页面 都生成   就不用写搬砖的代码了,生成的放到项目里,可以直接运行B 阿里巴巴数据库连接池druid

Lucene全文检索

 全文检索(Full-Text Retrieval)是指以文本作为检索对象,找出含有指定词汇的文本.全面.准确和快速是衡量全文检索系统的关键指标. l关于全文检索,我们要知道: 1,只处理文本. 2,不处理语义. 3,搜索时英文不区分大小写. 4,结果列表有相关度排序. l在信息检索工具中,全文检索是最具通用性和实用性的. Lucene全文检索

Spring MVC、Mybatis、Hibernate、Bootstrap、jQuery、HTML5、Spring Security安全权限、Lucene全文检索、Ehcache分布式缓存 、高性能、高并发【Java企业通用开发平台框架】

获取[下载地址]   QQ: 313596790   [免费支持更新] A 代码生成器(开发利器);    B 阿里巴巴数据库连接池druid;   数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都有明显的优势 C 安全权限框架shiro ;  D ehcache 自定义二级缓存; E 微信接口开发(后续会加入Activiti5 工作流 )免费升级 -------------------------------------------------------

【Lucene】Apache Lucene全文检索引擎架构之入门实战

Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供.Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻.在Java开发环境里Lucene是一个成熟的免费开源工具.就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库.--<百度百科> 这篇博文主要从两个方面出发,首先介绍一下Lucene中的全文搜索原理,其次通过程序示例来展现如何使用Lucene.关于全文搜索原理部分我上网搜索了一下,也看了好几篇文章,最后在写这篇文

lucene全文检索技术

1:lucene的介绍 全文检索引擎工具包.作用:使用lucene进行全文检索 .可以直接运行. 什么是全文检索.全文检索的场景,搜索引擎,搜索商品. 站内搜索,只会搜索自己站内的资源 全文检索首先将要查询的目标文档中的词提取出来,组成索引,通过查询索引达到搜索的文档的目的 这种先建立索引,在对索引进行搜索的过程就叫全文检索. 索引就类似于书籍的目录,目标文档就相当于书籍中的内容 搜索书籍中的内容,如果不通过目录,很费劲 其实,全文检索就是相当于给书籍编写目录. 2:Lucene实现全文检索的流

Lucene全文检索之-Lucene基础

Lucene是全文检索引擎 一.在学习Lucene之前我们先思考下,Lucene存在的意义. 1.在之前我们的应用场景中,基于数据库的检索,我们使用like语法进行.但是基于like语法效率低下.达不到我们对应用的使用要求. 而使用Lucene对我们的数据建立索引效率高速度快,满足企业要求. 我们使用Lucene先对整个结构建立索引库,然后根据索引去查找我们需要匹配的内容,效率高速度快,方便我们快速检索信息-这也是Lucene存在的目的. 2.有些查找数据库做不了,比如我们想查找附件中内容的匹配

Lucene全文检索(一)

全文检索的概念 1.从大量的信息中快速.准确的查找要的信息2.收索的内容是文本信息3.不是根据语句的意思进行处理的(不处理语义)4.全面.快速.准确是衡量全文检索系统的关键指标.5.搜索时英文不区分大小写,结果列表有相关度排序. 全文检索与数据库搜索的区别 1.数据库搜索Eg: select * from article where content like ‘%here%’结果where  here 缺点:1).搜索效果比较差2).在搜索的结果中,有大量的数据被搜索出来,有很多数据是没有用的3

Lucene全文检索入门体验

Lucene是Apache开源的全文检索框架, 是单纯的搜索工具, 简单易用. 现在已经出到5.2.1的版本, 只需在项目中导入必需的几个jar包就能使用. 使用的过程可以概括为, 1)  建立索引 2) 搜索查找, 获取搜索结果 这里我们一起先来学习几个会用到的核心类: Directory 该类在Lucene中用于描述索引存放的位置信息. 比如: Directory dir = FSDirectory.open(Paths.get("c:\\lucene\\index")); 其中&

Lucene全文检索学习入门

今天开始接触Lucene搜索,Lucene是一个全文检索的框架,主要适用于搜索,这里的搜索不同于天龙八部私服数据库的查询.Lucene是建立索引然后存在你设置的路径或者内存中,然后当你输入条件的时候就会去索引文件检索查询.Lucene能够实现分词和查询结构高亮的功能,而且在其强大的天龙八部私服架构下全文检索的速度是比较快的.由于Lucene将数据分词后以索引方式存储,这就势必会占内存或空间(Lucene的索引存储一般有文件存储和内存存储2种方式),我们就会将不必要的东西不存储.而我们一般在使用L