lucene基础

Lucene是一个高效的,基于Java的全文检索库。

文档地址:http://lucene.apache.org/core/5_0_0/core/overview-summary.html

我们从下往上看,很容易发现索引(index)是lucene的核心。

那lucene的索引(index)是怎么样的呢?

假设我们有1000份文档分别用编号1-1000表示吧。然后能得到以下结构

左边作为索引而右边作为一个文档链表。

比如第一行代表了lucene单词在2、3、10、35、92文档中

 那么lucene是怎么建索引的呢?

首先先是分析器analysis进行拆解

1 将文档分成一个一个单独的单词

2 去除标点符号

3 去除无意义的单词: a , the , this

4 单词小写

5 单词原型化:比如过去式、分词形式转换为原型

6 提取常量 :teamwork homework hoursework 这里work就可以提取出来

然后得到原始的单词组合再进行索引

索引的数据结构

Lucene 索引文件中,用一下基本类型来保存信息:
Byte:是最基本的类型,长8 位(bit)。
UInt32:由4 个Byte 组成。
UInt64:由8 个Byte 组成。
VInt:
变长的整数类型,它可能包含多个Byte,对于每个Byte 的8 位,其中后7 位表示
数值,最高1 位表示是否还有另一个Byte,0 表示没有,1 表示有。
越前面的Byte 表示数值的低位,越后面的Byte 表示数值的高位。
例如130 化为二进制为 1000, 0010,总共需要8 位,一个Byte 表示不了,因而需
要两个Byte 来表示,第一个Byte 表示后7 位,并且在最高位置1 来表示后面还有
一个Byte,所以为(1) 0000010,第二个Byte 表示第8 位,并且最高位置0 来表示
后面没有其他的Byte 了,所以为(0) 0000001。

OK,我们开始上代码去实验一下吧。

我们先想想一下整个过程再配合官方资料动手

索引

1 你首先有很多份文档或者数据需要储存

2 那么你得先指定一个建立index的目录

3 然后再用分析器把需要索引的文档或者数据进行解析和拆解

4 对简化的数据进行索引的建立

--------------------------

搜索

1 对搜索内容用分析器进行解析和拆解

2 搜索

3 对返回结果进行读取

pom.xml文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>Test</groupId>
    <artifactId>Test</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>Test Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.4</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-core</artifactId>
            <version>5.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-queryparser</artifactId>
            <version>5.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-analyzers-common</artifactId>
            <version>5.0.0</version>
        </dependency>
    </dependencies>

</project>

LuceneDemo.java(官方demo)

package com.newtouchone.lucene;

import static org.junit.Assert.assertEquals;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexableField;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;

public class LuceneDemo {

    public static void main(String[] args) throws Exception {
        Analyzer analyzer = new StandardAnalyzer();//解析器,用于将文档中的单词进行处理减少索引空间、同时也会对查询单词进行处理
        // Store the index in memory:
        Directory directory = new RAMDirectory();//打开内存空间
        // To store an index on disk, use this instead:
        // Directory directory = FSDirectory.open("/tmp/testindex");//打开本地磁盘
        IndexWriterConfig config = new IndexWriterConfig(analyzer);//配置写入流的解析器
        IndexWriter iwriter = new IndexWriter(directory, config);//indexwriter是索引写入的流

        Document doc = new Document();//建立文档
        String text = "This is the text to be indexed.";//需要保存的写入的内容
        doc.add(new Field("body", text, TextField.TYPE_STORED));//文档的一个属性(field),这里我写入body->内容
        doc.add(new Field("title","first", TextField.TYPE_STORED));//title->first
        iwriter.addDocument(doc);//索引里面添加此文档
        String text2 = "learning lecene";//同理上面
        Document doc2 = new Document();
        doc2.add(new Field("body", text2, TextField.TYPE_STORED));
        doc.add(new Field("title","second", TextField.TYPE_STORED));
        iwriter.addDocument(doc2);

        iwriter.close();//关闭索引流

        // Now search the index://搜索
        DirectoryReader ireader = DirectoryReader.open(directory); //打开索引地址
        IndexSearcher isearcher = new IndexSearcher(ireader);//创建搜索器
        // Parse a simple query that searches for "text":
        QueryParser parser = new QueryParser("body", analyzer);//在body里面进行搜索,简单来说就是搜索文档内容(我定义的文档是title和body(内容))
        Query query = parser.parse("indexed");//搜索含有index的文档
        ScoreDoc[] hits = isearcher.search(query, null, 1000).scoreDocs;//拿到命中结果

        assertEquals(1, hits.length);//验证

        // Iterate through the results:读取结果
        for (int i = 0; i < hits.length; i++) {for (IndexableField indexableField : hitDoc.getFields()) {//一个文档可以有多个field的,比如说我这次的文档有title和body
                System.out.println(indexableField.stringValue());//读取filed的内容
            }
        }
        ireader.close();
        directory.close();
    }

}

输出

This is the text to be indexed.
first

以上是根据官方文档进行学习的一份笔记,lecene经验+1。

时间: 2024-10-13 02:41:05

lucene基础的相关文章

Lucene全文检索之-Lucene基础

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

[全文检索]Lucene基础入门.

本打算直接来学习Solr, 现在先把Lucene的只是捋一遍. 本文内容: 1. 搜索引擎的发展史 2. Lucene入门 3. Lucene的API详解 4. 索引调优 5. Lucene搜索结果排名规则 1 搜索引擎的发展史 1.1 搜索引擎的发展史 萌芽:Archie.Gopher 起步:Robot(网络机器人)和spider(网络爬虫) 1. Robot:网络机器人,自动在网络中运行,完成特定任务的程序,如刷票器.抢票软件等. 2. spider:网络爬虫,是一中特殊的机器人,抓取(下载

Lucene基础(三)-- 中文分词及高亮显示

Lucene分词器及高亮 分词器 在lucene中我们按照分词方式把文档进行索引,不同的分词器索引的效果不太一样,之前的例子使用的都是标准分词器,对于英文的效果很好,但是中文分词效果就不怎么样,他会按照汉字的字直接分词,没有词语的概念. 使用分词的地方只需要把Analyzer实例化成我们第三方的分词器即可 中文分词有很多,这里使用IKAnalyzer 为例, 下载地址 https://git.oschina.net/wltea/IK-Analyzer-2012FF 现在下来后里面有一篇教程. 高

Lucene基础(四)-- 结合数据库使用

需求 很多时候我们在用数据库的需要使用模糊查询,我们一般会使用like语句来做,然而这样的做的效率不是很多(很抱歉我们亲自去测,很多都这么说的),那么使用Lucene来检索的话,效率会高很多. lucene结合数据库步骤 写一段传统的JDBC程序,将每条的用户信息从数据库读取出来 针对每条用户记录,建立一个lucene document Document doc = new Document(); 并根据你的需要,将用户信息的各个字段对应luncene document中的field 进行添加,

Lucene基础(一)--入门

Lucene介绍 lucene的介绍,这里引用百度百科的介绍Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言).Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎.Lucene是一套用于全文检索和搜寻的开源程式库,

Lucene基础(二)--索引的操作

索引的操作 我们建立所有就是要达到快速检索的目的,对数据能够方面便的查找,和数据库类似,索引也有自己的相关增删改查的操作. 在索引的增删改查中,增删改属于写操作,主要是有IndexWrite提供的方法处理:而查显而易见,读操作,使用IndexSeacher 提供的方法来实现.在Lucene的官方文档找到 org.apache.lucene.index.IndexWriter 这个类,我们就可以看到他很多方法. 创建索引 如同上一章里面的代码,创建索引时先建立文件,创建索引的域,再使用IndexW

Lucene 基础类型

Lucene 索引文件中,用一下基本类型来保存信息:1. Byte:是最基本的类型,长 8 位(bit).2. UInt32:由 4 个 Byte 组成.3. UInt64:由 8 个 Byte 组成.4. VInt: " 变长的整数类型,它可能包 多个 Byte,对于每个 Byte 的 8 位,其中后 7 位表示数值,最高 1 位表示是否还有另一个 Byte,0 表示没有,1 表示有. " 越前面的 Byte 表示数值的低位,越后面的 Byte 表示数值的高位. " 例如

Lucene 基础数据压缩处理

Lucene 为了使的信息的存储占用的空间更小,访问速度更快,采取了一些特殊的技巧,然 而在看 Lucene 文件格式的时候,这些技巧却容易使我们感到困惑,所以有必要把这些特殊 的技巧规则提取出来介绍一下. 在下不才,胡乱给这些规则起了一些名字,是为了方便后面应用这些规则的时候能够简单, 不妥之处请大家谅解. 1. 前缀后缀规则(Prefix+Suffix) Lucene 在反向索引中,要保存词典(Term Dictionary)的信息,所有的词(Term)在词典中是按照 39 字典顺序进行排列

lucene总结(一):lucene基础

在一般的结构化数据库中,一般去找一个字段的匹配,使用最多的就是like语句.这种情况下,就像在小时候妈妈给我买的新华字典里去一页页翻出自己的名字一样,效率相对的底下,较为快速的的方式是什么呢?就是通过新华字典的前面的索引来取找,而全文索引就是做的这样的一个工作.为你需要查找的"数据源"做各种的分析索引文件.这里的数据源可以是txt文件,图片文件等结构化的文件.而lucene是全文索引中比较优秀的第三方工具. 下载地址: http://apache.fayea.com/lucene/ja