lucene 5.2.0学习笔记

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)

字符串或者流   分词 索引 

来自为知笔记(Wiz)

时间: 2024-11-07 09:16:30

lucene 5.2.0学习笔记的相关文章

微软企业库5.0学习笔记(10)ASP.NET模块依赖注入

您可以使用HTTP模块,一个到ASP.NET HttpApplicationState类的扩展,在Global.asax编写代码强制ASP.NET在每一个页面请求时自动注入依赖的对象,就像在ASP.NET Web窗体应用程序中讨论的一样. 下列方法显示了一个合适的方法能够获取PreRequestHandlerExecute事件将它自己注入到ASP.NET的执行流水线,在每个页面请求中通过容器的BuildUp方法运行Http模块,并获取OnPageInitComplete事件.当OnPageIni

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

不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.supervisor.mysql环境搭建搭建好了.net core linux的相关环境,今天就来说说ef core相关的配置及迁移: 简介: Entity Framework(以下简称EF) 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,EF Core是Entity

Swift 2.0学习笔记(Day5)——我所知道的标识符和关键字

Swift 2.0学习笔记(Day5)--我所知道的标识符和关键字   原创文章,欢迎转载.转载请注明:关东升的博客 好多计算机语言都有标识符和关键字,一直没有好好的总结,就是这样的用着,现在小小的整理一下Swift中的标识符和关键字. 什么是标识符呢? 标识符就是给变量.常量.方法.函数.枚举.结构体.类.协议等由开发人员指定的名字. 其实,构成标识符的字母是有一定规范的,Swift中命名规则是: 区分大小写,Myname与myname是两个不同的标识符: 标识符首字符可以以下划线(_)或者字

Quartz.NET 2.0 学习笔记(1) :Quartz.NET简介

转自:http://www.cnblogs.com/lzrabbit/archive/2012/04/13/2447609.html Quartz.NET 项目地址 http://quartznet.sourceforge.net/ Quartz.NET 2.0 学习笔记(1) :Quartz.NET简介 Quartz.NET 2.0 学习笔记(2) :和1.0的几点不同 Quartz.NET 2.0 学习笔记(3) :通过配置文件实现任务调度 Quartz.NET 2.0 学习笔记(4) :c

Swift 2.0学习笔记(Day 29)——访问级别

Swift 2.0学习笔记(Day 29)——访问级别 原创文章,欢迎转载.转载请注明:关东升的博客 访问级别: Swift提供了3种不同访问级别,对应的访问修饰符为:public.internal和private.这些访问修饰符可以修饰类.结构体.枚举等面向对象的类型,还可以修饰变量.常量.下标.元组.函数.属性等内容. l public.可以访问自己模块中的任何public实体.如果使用import语句引入其他模块,我们可以访问其他模块中的public实体. l internal.只能访问自

Hadoop1.0.0学习笔记

Hadoop1.0.0学习笔记 一.  安装JDK,配置环境JAVA环境变量 exportJAVA_HOME=/home/ligang/jdk1.6.0_26 exportJRE_HOME=/home/ligang/jdk1.6.0_26/jre exportCLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH 二.  安装Hadoop-1.0.0 1.     下载hadoop文件,地址为:http://hadoop.apache.org/co

Swift 2.0学习笔记(Day 37)——默认构造函数

Swift 2.0学习笔记(Day 37)--默认构造函数原创文章,欢迎转载.转载请注明:关东升的博客 结构体和类的实例在构造过程中会调用一种特殊的init方法,称为构造函数.构造函数没有返回值,可以重载.在多个构造函数重载的情况下,运行环境可以根据它的外部参数名或参数列表调用合适的构造函数.默认构造函数结构体和类在构造过程中会调用一个构造函数,即便是没有编写任何构造函数,编译器也会提供一个默认的构造函数.下面看示例代码: class Rectangle { var width: Double

Swift 2.0学习笔记(Day 9)——离开表达式你试试!

Swift 2.0学习笔记(Day 9)--离开表达式你试试! 原创文章,欢迎转载.转载请注明:关东升的博客   表达式啊是很重要地. 在Swift中,表达式有3种形式. l  不指定数据类型 var a1 = 10 l  指定数据类型 var a1:Int  = 10 l  使用分号 var a1:Int = 10; vara2:Int = 20 在Swift语言中,一条语句结束后可以不加分号也可以添加分号,但是有一种情况必须要用分号,那就是多条语句写在一行的时候,需要通过分号来区别语句. 例

Swift 2.0学习笔记(Day 3)——Swift 2.0之后增加的关键字

Swift 2.0学习笔记(Day 3)——Swift 2.0之后增加的关键字 看了之前的学习笔记知道了什么是关键字,现在提示各位在Swift 2.0之后增加defer.guard.repeat.catch.rethrows.throw.throws和try关键字,其中repeat关键字替代do - while循环中的do,即中repeat - while循环.而do关键字用于错误处理.catch.rethrows.throw.throws和try是错误处理关键字. 错误处理是Swift 2.0