package com.bc.cas.manager;

import com.bc.cas.dao.BookDao;
import com.bc.cas.model.entity.Book;
import com.google.common.base.Objects;
import com.google.common.collect.Lists;
import org.apache.log4j.helpers.LogLog;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.analysis.util.CharArraySet;
import org.apache.lucene.document.*;
import org.apache.lucene.index.*;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.*;
import org.apache.lucene.store.FSDirectory;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.util.CollectionUtils;

import java.io.IOException;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;


/**
 * @Copyright 2012-2016 duenboa 版权所有
 * @Author Created by Administrator on 2016/11/29.
 * @Version V 1.0.0
 * @Desc 索引管理器
 */

@Repository
public class IndexManager {

    @Autowired
    private BookDao bookDao;

    static FSDirectory dir;

    static {
        try {
            dir = FSDirectory.open(Paths.get("d:/lucene/lucene052_index05"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 创建索引 -common
     */
    @Test
    public void createIndex(List<Document> docs) throws IOException {

        if (docs == null) {
            return;
        }

        // 自定义停用词
        List<String> strings = Arrays.asList("的", "在", "了", "呢", ",", "0", ":", ",", "是", "这", "那", "么");
        CharArraySet unUsefulWorlds = new CharArraySet(strings, true);

        // 加入系统默认停用词
        Iterator<Object> itor = SmartChineseAnalyzer.getDefaultStopSet().iterator();
        while (itor.hasNext()) unUsefulWorlds.add(itor.next());
        //指定了停用词的分词器
        Analyzer analyzer = new SmartChineseAnalyzer(unUsefulWorlds);

        IndexWriterConfig config = new IndexWriterConfig(analyzer);
        IndexWriter writer = new IndexWriter(dir, config);

        writer.addDocuments(docs);
        writer.commit();
        writer.close();
    }


    /**
     * 执行查询 -common
     *
     * @param query
     * @throws IOException
     * @throws ParseException
     */
    private static void doQuery(Query query) throws IOException, ParseException {
        IndexReader reader = DirectoryReader.open(dir);
        IndexSearcher searcher = new IndexSearcher(reader);

        //执行query,获取指定条数的顶行记录
        TopDocs topDocs = searcher.search(query, 10);
        System.out.println("搜索出的总记录数为: " + topDocs.totalHits);

        //评分文档集合
        ScoreDoc[] docs = topDocs.scoreDocs;
        for (ScoreDoc doc : docs) {
            //获取文档id
            int id = doc.doc;
            //根据文档id查询文档对象
            Document document = searcher.doc(id);

            //打印信息
            System.out.println(
                    Objects.toStringHelper("docuemnt")
                            .add("文档id", document.get("id"))
                            .add("文档名称", document.get("name"))
                            .add("文档图片", document.get("pic"))
                            .add("文档描述", document.get("description"))
                            .toString());
        }
        reader.close();
    }


    /**
     * 测试新建索引
     */
    public void testCreateIndex() {
        List<Book> bookList = bookDao.findAll();
        if (CollectionUtils.isEmpty(bookList)) return;

        List<Document> docList = Lists.newArrayList();
        Document doc;
        for (Book book : bookList) {
            doc = new Document();
            doc.add(new StoredField("id", book.getId()));
            doc.add(new StringField("name", book.getName(), Field.Store.YES));
            doc.add(new TextField("pic", book.getPic(), Field.Store.YES));
            doc.add(new TextField("description", book.getDescription(), Field.Store.YES));
            docList.add(doc);
        }

        try {
            createIndex(docList);
        } catch (IOException e) {
            LogLog.error(e.getMessage(), e);
        }
    }

    /**
     *
     * 查询
     *
     * @throws IOException
     */
    @Test
    public static void testQuery() throws IOException, ParseException {
        QueryParser parser = new QueryParser("description", new SmartChineseAnalyzer());
        Query query = parser.parse("description:java AND lucene");
        doQuery(query);
    }


}




Field类的子类和说明, 以及用法:

StoredField(FieldName, FieldValue) 

重载,支持多种类型
 不分词
不索引 
示例:
StringField(FieldName,  String FieldValue, Store.YES)

 字符串类型数据 
不分词    
索引 
示例: 订单号, id, 手机号等
LongField(FieldName, Long FieldValue,   Store.YES) 

Long型数据    
 分词
索引 
 示例: 价格
TextField(FieldName, FieldValue, Store.YES)    或 TextField(FieldName, Reader)

字符串或者流 
 分词
索引 














lucene 5.2.0学习笔记的更多相关文章

  1. DirectX 总结和DirectX 9.0 学习笔记

    转自:http://www.cnblogs.com/graphics/archive/2009/11/25/1583682.html DirectX 总结 DDS DirectXDraw Surfac ...

  2. 一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移

    不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.superviso ...

  3. vue2.0学习笔记之路由(二)路由嵌套+动画

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. vue2.0学习笔记之路由(二)路由嵌套

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. hdcms v5.7.0学习笔记

    hdcms v5.7.0学习笔记 https://note.youdao.com/ynoteshare1/index.html?id=c404d63ac910eb15a440452f73d6a6db& ...

  6. dhtmlxgrid v3.0学习笔记

    dhtmlxgrid v3.0学习笔记 分类: dhtmlx JavaScript2012-01-31 15:41 1744人阅读 评论(0) 收藏 举报 stylesheetdatecalendar ...

  7. OAuth 2.0学习笔记

    文章目录 OAuth的作用就是让"客户端"安全可控地获取"用户"的授权,与"服务商提供商"进行互动. OAuth在"客户端&quo ...

  8. 一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx、supervisor、mysql环境搭建

    作为.neter,看到.net core 2.0的正式发布,心里是有点小激动的,迫不及待的体验了一把,发现速度确实是快了很多,其中也遇到一些小问题,所以整理了一些学习笔记: 阅读目录 环境说明 安装C ...

  9. RxJava2.0学习笔记2 2018年7月3日 周二

    摘记: 1.map -- 转换  有些服务端的接口设计,会在返回的数据外层包裹一些额外信息,这些信息对于调试很有用,但本地显示是用不到的.使用 map() 可以把外层的格式剥掉,只留下本地会用到的核心 ...

随机推荐

  1. js抽象工厂模式

    抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么.这样客户就可以从具体 ...

  2. Maven基础配置

    重要网址 Maven主页:http://maven.apache.org/ Maven central repository:http://search.maven.org/ Maven aliyun ...

  3. Spring Boot入门——全局异常处理

    1.后台处理异常 a.引入thymeleaf依赖 <!-- thymeleaf模板插件 --> <dependency> <groupId>org.springfr ...

  4. SSIS包的组建之连接管理器

    上一篇我们通过一个示例来介绍一下SSIS 包的开发.接下来的内容我们将学习一下包中各个选项卡的使用.如:连接管理器选项卡.控制流选项卡.数据流选项卡和事件处理选项卡等等.这一篇将介绍一下连接管理器作用 ...

  5. IOC和DI,AOP的本质理解

    IOC: Inversion of Control,控制反转, 控制权从应用程序转移到框架(如IOC容器),是框架共有的特性. 对于IOC的理解,可以把IOC看作是一个生产和管理bean对象的容器.原 ...

  6. 完全分布式安装hadoop集群

    0.安装jdk 1.配置hosts文件 2.建立hadoop运行账号 3.配置ssh免密码登录 4.在namenode上配置hadoop 4.1.修改hadoop-env.sh文件 4.2.修改yar ...

  7. 分布式_事务_02_2PC框架raincat源码解析

    一.前言 上一节已经将raincat demo工程运行起来了,这一节来分析下raincat的源码 二.协调者启动过程 主要就是在启动类中通过如下代码来启动 netty nettyService.sta ...

  8. Codeforces Round #253 (Div. 2)B(暴力枚举)

    就暴力枚举所有起点和终点就行了. 我做这题时想的太多了,最简单的暴力枚举起始点却没想到...应该先想最简单的方法,层层深入. #include<iostream> #include< ...

  9. Shiro-RememberMe

    概述 认证和记住我 建议 身份验证相关 实现 如果要自己做RememeberMe,需要在登录之前创建Token:UsernamePasswordToken(用户名,密码,是否记住我),且调用 User ...

  10. qduoj su003 数组合并

    描述 现在呢有两个整形数组,a[n]和b[m],而且已经知道这两个数组都是非降序数组.现在呢就有一个工作需要你来完成啦.对于a中的每个元素a[i]在b中寻找<=a[i] 的元素个数,个数记为x[ ...