lucene 索引 demo

核心util

/**
 * Alipay.com Inc.
 * Copyright (c) 2004-2015 All Rights Reserved/
 */
package com.lucene.demo;

import com.demo.convertor.BookConvertor;
import com.demo.domain.BookDO;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.util.Version;

import java.io.IOException;

/**
 * 索引操作工具
 *
 * @author baoxing.gbx
 * @version $Id:IndexUtil.java, V 0.1 2015-11-15 14:23 baoxing.gbx Exp $$
 */
public class IndexUtil extends BaseUtil {

    /**
     * 创建索引
     */
    public static void creatIndex() throws Exception {

        try {
            //  循环添加书
            for (int i = 1; i <= 2; ++i) {

                BookDO bookDO = new BookDO();
                bookDO.setId(i);
                bookDO.setAuthor("zhangsan" + i);
                bookDO.setName("Java program" + i);
                bookDO.setContent("Java是一种可以撰写跨平台应用程序的面向对象的程序设计开发语言");
                addDoc(bookDO);
            }

            for (int i = 3; i <= 4; ++i) {
                BookDO bookDO = new BookDO();
                bookDO.setId(i);
                bookDO.setAuthor("lisi" + i);
                bookDO.setName("Java program" + i);
                bookDO.setContent(
                    "Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网");
                addDoc(bookDO);
            }

            for (int i = 5; i <= 6; ++i) {
                BookDO bookDO = new BookDO();
                bookDO.setId(i);
                bookDO.setAuthor("wangwu" + i);
                bookDO.setName("Java program" + i);
                bookDO.setContent("同时拥有全球最大的开发者专业社");
                addDoc(bookDO);
            }

            for (int i = 7; i <= 8; ++i) {

                BookDO bookDO = new BookDO();
                bookDO.setId(i);
                bookDO.setAuthor("xiaoming" + i);
                bookDO.setName("C++ program" + i);
                bookDO.setContent("C++是在C语言的基础上开发的一种面向对象编程语言");
                addDoc(bookDO);
            }
        } catch (Exception e) {
            logger.equals("索引创建失败:" + e.getMessage());
            throw e;
        }
    }

    /**
     * 删除索引
     */
    public static void deleteIndex() throws Exception {

        try {
            Term term = new Term("id", 1 + "");

            IndexWriter indexWriter = getIndexWriter();

            indexWriter.deleteDocuments(term);
            indexWriter.commit();
        } catch (Exception e) {
            logger.error("删除索引失败");
            throw e;
        }

    }

    /**
     * 删除索引
     */
    public static void deleteAllIndex() throws Exception {
        try {
            getIndexWriter().deleteAll();
            getIndexWriter().commit();

        } catch (IOException e) {

            logger.equals("索引删除失败:" + e.getMessage());
            throw e;
        }
    }

    /**
     * 删除索引
     */
    public static void updateIndex() throws Exception {
        Term term = new Term("id", 1 + "");
        BookDO bookDO = new BookDO();
        bookDO.setId(1);
        bookDO.setAuthor("zhangsan" + 1);
        bookDO.setName("Java program" + 1);
        bookDO.setContent("Java");

        try {
            getIndexWriter().updateDocument(term, BookConvertor.convert2Doc(bookDO));
            getIndexWriter().commit();
        } catch (IOException e) {
            logger.equals("索引更新失败:" + e.getMessage());
            throw e;
        }
    }

    /**
     * 模拟数据库添加,同时添加索引
     *
     * @param bookDO
     * @throws IOException
     */
    private static void addDoc(BookDO bookDO) throws IOException {

        // 数据库操作
        dataBase.put(bookDO.getId() + "", bookDO);
        // 索引操作
        Document document = BookConvertor.convert2Doc(bookDO);
        getIndexWriter().addDocument(document);
        // 必须提交否则不奏效
        getIndexWriter().commit();
    }

    /**
     * 检索
     *
     * @param keyword
     */
    public static void search(String keyword) throws Exception {

        IndexSearcher searcher = null;

        try {
            // 创建search
            searcher = getIndexSearcher();

            String[] fields = { "name", "author", "content" };
            QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_35, fields,
                new StandardAnalyzer(Version.LUCENE_35));
            queryParser.setDefaultOperator(QueryParser.AND_OPERATOR);
            Query query = queryParser.parse(keyword);

            // 查询
            TopDocs topDocs = searcher.search(query, MAX);

            ScoreDoc[] scoreDocs = topDocs.scoreDocs;
            logger.info("查询到条数=" + scoreDocs.length);

            for (ScoreDoc scoreDoc : scoreDocs) {
                Document doc = searcher.doc(scoreDoc.doc);
                logger.info("doc信息:" + "docId=" + scoreDoc.doc + "id=" + doc.get("id") + "author="
                            + doc.get("author") + "name=" + doc.get("name") + "content="
                            + doc.get("content"));
            }

        } catch (Exception e) {
            logger.error("查询失败:" + e.getMessage());
            throw e;
        }
    }

    public static void numDocs() throws IOException {
        IndexReader indexReader = getIndexReader();
        logger.info("已删除的数量" + indexReader.numDeletedDocs());
        logger.info("numDocs" + indexReader.numDocs());
        logger.info("maxDoc" + indexReader.maxDoc());
    }

}

  

测试

/**
 * Alipay.com Inc.
 * Copyright (c) 2004-2015 All Rights Reserved/
 */
package com.demo;

import com.lucene.demo.IndexUtil;

import org.junit.Test;

import junit.framework.TestCase;

import java.io.IOException;

/**
 *
 * @author baoxing.gbx
 * @version $Id:IndexUtilTest.java, V 0.1 2015-11-15 14:49 baoxing.gbx Exp $$
 */
public class IndexUtilTest extends TestCase {

    @Override
    protected void setUp() throws Exception {
        IndexUtil.creatIndex();
    }

    /**
     * 创建索引
     *
     */
    @Test
    public void testCreate() {

        try {
            IndexUtil.creatIndex();
        } catch (Exception e) {
            assertTrue(e.getMessage(), false);
        }
    }

    /**
     * 删除索引
     */
    @Test
    public void testDelete() {

        try {
            IndexUtil.search("Java");
            IndexUtil.numDocs();

            IndexUtil.deleteIndex();

            IndexUtil.search("Java");
            IndexUtil.numDocs();
        } catch (Exception e) {
            assertTrue(e.getMessage(), false);
        }
    }

    /**
     * 删除索引
     */
    @Test
    public void testDeleteAll() {

        try {

            IndexUtil.search("Java");
            IndexUtil.numDocs();

            IndexUtil.deleteAllIndex();

            IndexUtil.search("Java");
            IndexUtil.numDocs();
        } catch (Exception e) {
            assertTrue(e.getMessage(), false);
        }

    }

    /**
     * 删除索引
     */
    @Test
    public void testSearch() throws Exception {

        try {

            IndexUtil.search("Java");
            IndexUtil.numDocs();

        } catch (Exception e) {
            assertTrue(e.getMessage(), false);
        }

    }

    @Test
    public void testNuns() throws Exception {

        try {

            IndexUtil.numDocs();

        } catch (IOException e) {
            assertTrue(e.getMessage(), false);
        }
    }

    /**
     * 更新
     *
     * @throws Exception
     */
    @Test
    public static void testUpdate() throws Exception {

        try {

            IndexUtil.numDocs();
            IndexUtil.search("Java");

            IndexUtil.updateIndex();

            System.out.println("更新完毕");

            IndexUtil.numDocs();
            IndexUtil.search("Java");

        } catch (IOException e) {
            assertTrue(e.getMessage(), false);
        }
    }
}

  

git代码地址: https://github.com/EstarG/lucenceDemo

时间: 2024-11-11 01:26:45

lucene 索引 demo的相关文章

Lucene索引过程中的内存管理与数据存储

Lucene的索引过程分两个阶段,第一阶段把文档索引到内存中:第二阶段,即内存满了,就把内存中的数据刷新到硬盘上.          倒排索引信息在内存存储方式 Lucene有各种Field,比如StringField,TextField,IntField,FloatField,DoubleField-,Lucene在处理的过程中把各种Field都处理成相应的byte[],以最本质的方式来看待各种Field的内容,统一了数据的存储形式. 在写入内存阶段,第一步就是需要理清各个类之间的关系. 在索

lucene 索引合并策略

在索引算法确定的情况下,最为影响Lucene索引速度有三个参数--IndexWriter中的 MergeFactor, MaxMergeDocs, RAMBufferSizeMB .这些参数无非是控制内外存交换和索引合并频率,从而达到提高索引速度.当然这些参数的设置也得依照硬件条件灵活设置. MaxMergeDocs该参数决定写入内存索引文档个数,到达该数目后就把该内存索引写入硬盘,生成一个新的索引segment文件. 所以该参数也就是一个内存buffer,一般来说越大索引速度越快. MaxBu

Luke 5—— 可视化 Lucene 索引查看工具,可以查看ES的索引

Luke 5 发布,可视化 Lucene 索引查看工具  oschina 发布于2015年08月31日 这是一个主要版本,该版本支持 Lucene 5.2.0. 它支持 elasticsearch 1.6.0(Lucene的4.10.4) 已解决的问题:#20增加支持重建索引并不会存储领域,不暴露位置的字段值. Pull Requests:#23 Elasticsearch 支持和阴影插件组装#26 添加 .gitignore 文件#27 支持 Lucene 5#28 luke.sh 新增LUK

一步一步跟我学习lucene(18)---lucene索引时join和查询时join使用示例

了解sql的朋友都知道,我们在查询的时候可以采用join查询,即对有一定关联关系的对象进行联合查询来对多维的数据进行整理.这个联合查询的方式挺方便的,跟我们现实生活中的托人找关系类似,我们想要完成一件事,先找自己的熟人,然后通过熟人在一次找到其他,最终通过这种手段找到想要联系到的人.有点类似于"世间万物皆有联系"的感觉. lucene的join包提供了索引时join和查询时join的功能: Index-time join 大意是索引时join提供了查询时join的支持,且IndexWr

lucene 索引流程整理笔记

索引的原文档(Document). 为了方便说明索引创建过程,这里特意用两个文件为例: 文件一:Students should be allowed to go out with their friends, but not allowed to drink beer. 文件二:My friend Jerry went to school to see his students but found them drunk which is not allowed. 结果处的索引文件: Docume

MySQL和Lucene索引对比分析

MySQL和Lucene都可以对数据构建索引并通过索引查询数据,一个是关系型数据库,一个是构建搜索引擎(Solr.ElasticSearch)的核心类库.两者的索引(index)有什么区别呢?以前写过一篇<Solr与MySQL查询性能对比>,只是简单的对比了下查询性能,对于内部原理却没有解释,本文简单分析下两者的索引区别. MySQL索引实现 在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式. M

lucene索引库的增删改查操作

1. 索引库的操作 保持数据库与索引库的同步 说明:在一个系统中,如果索引功能存在,那么数据库和索引库应该是同时存在的.这个时候需要保证索引库的数据和数据库中的数据保持一致性.可以在对数据库进行增.删.改操作的同时对索引库也进行相应的操作.这样就可以保证数据库与索引库的一致性. 工具类DocumentUtils 在对索引库进行操作时,增.删.改过程要把一个JavaBean封装成Document,而查询的过程是要把一个Document转化成JavaBean.在进行维护的工作中,要反复进行这样的操作

使用Lucene索引和检索POI数据

使用Lucene索引和检索POI数据 摘要: 1.简介 关于空间数据搜索,以前写过<使用Solr进行空间搜索>这篇文章,是基于Solr的GIS数据的索引和检索. Solr和ElasticSearch这两者都是基于Lucene实现的,两者都可以进行空间搜索(Spatial Search),在有些场景,我们需要把Lucene嵌入到已有的系统提供... 1.简介 关于空间数据搜索,以前写过<使用Solr进行空间搜索>这篇文章,是基于Solr的GIS数据的索引和检索. Solr和Elast

Lucene索引文件学习

?最近在做搜索,抽空看一下lucene,资料挺多的,不过大部分都是3.x了--在对着官方文档大概看一下. 优化后的lucene索引文件(4.9.0) 一.段文件 1.段文件:segments_5p和segments.gen. segments.gen保存当前段文件版本信息. segments.gen: GenHeader, Generation, Generation, Footer segments_N(segments_5p)保存最新的段的信息,包括段的个数,每个段的段名.文档数等信息. s