1. 案例:

Article.java

package cn.toto.lucene.quickstart;

publicclassArticle
{

privateintid;

private
Stringtitle;

private
Stringcontent;

/**

*
@return the id

*/

publicint
getId() {

returnid;

}

/**

*
@param id the id to set

*/

publicvoid
setId(int id) {

this.id
= id;

}

/**

*
@return the title

*/

public
String getTitle() {

returntitle;

}

/**

*
@param title the title to set

*/

publicvoid
setTitle(String title) {

this.title
= title;

}

/**

*
@return the content

*/

public
String getContent() {

returncontent;

}

/**

*
@param content the content to set

*/

publicvoid
setContent(String content) {

this.content
= content;

}

}

工具类Configuration.java

package cn.toto.lucene.util;

import java.io.File;

import org.apache.lucene.analysis.Analyzer;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.store.Directory;

import org.apache.lucene.store.FSDirectory;

import org.apache.lucene.util.Version;

/**

* @brief Configuration.java配置对象,提供Lucene需要  索引目录,分词器

* @attention

* @author toto

* @date 2014-12-7

* @note begin modify by涂作权

*/

public class Configuration {

private static Directory directory;

private static Analyzer analyzer;

private static Version version;

static {

try {

//设置磁盘目录,表示的是本地index目录

directory = FSDirectory.open(new File("index"));

} catch (Exception e) {

e.printStackTrace();

}

//表示LUCENE版本

version = Version.LUCENE_36;

//表示使用版本

analyzer = new StandardAnalyzer(version);

}

//提供目录

public static Directory getDirectory()

{

return directory;

}

//提供分词器

public static Analyzer getAnalyzer()

{

return analyzer;

}

//获取版本

public static Version getVersion()

{

return version;

}

}

工具类LuceneUtils.java

package cn.toto.lucene.util;

import java.io.IOException;

import org.apache.lucene.index.CorruptIndexException;

import org.apache.lucene.index.IndexReader;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.index.IndexWriterConfig;

import org.apache.lucene.search.IndexSearcher;

// lucene工具类

public class LuceneUtils {

private static IndexWriter indexWriter;

static {

//
索引目录位置

try {

//
写入索引

IndexWriterConfig indexWriterConfig = new IndexWriterConfig(

Configuration.getVersion(), Configuration.getAnalyzer());

indexWriter = new IndexWriter(Configuration.getDirectory(),

indexWriterConfig);

//
绑定虚拟机退出事件,关闭IndexWriter

Runtime.getRuntime().addShutdownHook(new Thread() {

@Override

public void run() {

try {

indexWriter.close();

} catch (CorruptIndexException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

});

} catch (IOException e) {

e.printStackTrace();

}

}

//
提供获取IndexWriter对象

public static IndexWriter getIndexWriter() {

return indexWriter;

}

//
获得查询IndexSeacher对象

public static IndexSearcher getIndexSearcher() throws Exception {

return new IndexSearcher(IndexReader.open(Configuration.getDirectory()));

}

}

LuceneTest.java

package cn.toto.lucene.api;

import java.io.File;

importjava.io.IOException;

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.Field.Store;

import org.apache.lucene.index.CorruptIndexException;

import org.apache.lucene.index.IndexReader;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.index.IndexWriterConfig;

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.store.Directory;

import org.apache.lucene.store.FSDirectory;

import org.apache.lucene.store.LockObtainFailedException;

import org.apache.lucene.store.RAMDirectory;

import org.apache.lucene.util.Version;

import org.junit.Test;

import cn.toto.lucene.quickstart.Article;

import cn.toto.lucene.util.LuceneUtils;

// API详细分析

publicclass
LuceneTest {

@Test

//使用LuceneUtils解决
IndexWriter并发问题

@SuppressWarnings("unused")

publicvoid
testLock2() {

IndexWriter indexWriter2 = LuceneUtils.getIndexWriter();

IndexWriter indexWriter1 = LuceneUtils.getIndexWriter();

}

@Test

@SuppressWarnings("all")

//使用两个IndexWrtier报错,锁使用问题

publicvoid
testLock()throws CorruptIndexException,

LockObtainFailedException,
IOException {

//索引目录位置

Directory directory = FSDirectory.open(new
File("index"));//当前工程index目录

//分词器

Analyzer analyzer =
new StandardAnalyzer(Version.LUCENE_36);

//写入索引

IndexWriterConfig indexWriterConfig =
new IndexWriterConfig(

Version.LUCENE_36,
analyzer);

IndexWriter indexWriter =
new IndexWriter(directory, indexWriterConfig);

IndexWriterConfig indexWriterConfig2 =
new IndexWriterConfig(

Version.LUCENE_36,
analyzer);

IndexWriter indexWriter2 =
new IndexWriter(directory,

indexWriterConfig2);

}

上面的运行结果如下:

@Test

//测试Store和
Index

/*

* Store.YES
存储、Store.NO不存储
Index.NO不建立索引 Index.ANALYZED分词建立索引

* Index.NOT_ANALYZED
不分词建立索引Index.ANALYZED_NO_NORMS
分词建立索引,不存放权重信息

* Index.NOT_ANALYZED_NO_NORMS
不分词建立索引,不存放权重信息

*/

publicvoid
testIndex()throws Exception {

//需要建立索引目标数据

Article article =
new Article();

article.setId(100);

article.setTitle("学习全文检索");

article.setContent("lucene是搜索引擎开发技术,lucene并不是一个现成的产品,由Apache提供");

//将索引数据转换
Document对象(lucene要求)

Document document =
new Document();

document.add(new
Field("id", article.getId() +
"", Store.YES,

Field.Index.NOT_ANALYZED));//对于id通常不分词

document.add(new
Field("title", article.getTitle(), Store.YES,

Field.Index.ANALYZED_NO_NORMS));

document.add(new
Field("content", article.getContent(), Store.YES,

Field.Index.ANALYZED));

//建立索引库

//索引目录位置

Directory directory = FSDirectory.open(new
File("index"));//当前工程index目录

//分词器

Analyzer analyzer =
new StandardAnalyzer(Version.LUCENE_36);

//写入索引

IndexWriterConfig indexWriterConfig =
new IndexWriterConfig(Version.LUCENE_36,
analyzer);

IndexWriter indexWriter =
new IndexWriter(directory, indexWriterConfig);

//将document数据写入索引库

indexWriter.addDocument(document);

indexWriter.close();

}

上面的单元测试的结果

@Test

//查询索引库
,查看norms效果

publicvoid
testQuery()throws Exception {

//建立Query对象
---- 根据标题

String queryStrng =
"检索";

Analyzer analyzer =
new StandardAnalyzer(Version.LUCENE_36);

QueryParser queryParser =
new QueryParser(Version.LUCENE_36,"title",

analyzer);

Query query = queryParser.parse(queryStrng);

//根据Query查找

Directory directory = FSDirectory.open(new
File("index"));

IndexSearcher indexSearcher =
new IndexSearcher(

IndexReader.open(directory));

//执行查询获得满足结果前多少条记录

TopDocs topDocs = indexSearcher.search(query, 100);//查询满足结果前100条数据

System.out.println("满足结果记录条数:"
+ topDocs.totalHits);

//获得每个结果

ScoreDoc[] scoreDocs = topDocs.scoreDocs;

for
(int i = 0; i < scoreDocs.length;
i++) {

//打印得分

System.out.println("得分:"
+ scoreDocs[i].score);

//获得Document下标

int
docID = scoreDocs[i].doc;

Document document = indexSearcher.doc(docID);

System.out.println("id:"
+ document.get("id"));

System.out.println("title:"
+ document.get("title"));

System.out.println("content:"
+ document.get("content"));

}

indexSearcher.close();

}

上面的运行单元测试之后的结果如下:

@SuppressWarnings("unused")

@Test

//测试路径写法

publicvoid
testDirectory()throwsIOException
{

//磁盘路径

FSDirectory.open(new
File("index"));//当前工程index目录,相对路径

FSDirectory.open(new
File("d:\\index"));//绝对路径

//类路径
WEB-INF/classes

FSDirectory.open(new
File(LuceneTest.class.getResource("/").getFile()));

//内存路径

Directory directory =
new RAMDirectory();

}

}

4.Lucene3.案例介绍,创建索引,查询等操作验证的更多相关文章

  1. java mongodb 基础系列---查询,排序,limit,$in,$or,输出为list,创建索引,$ne 非操作

    官方api教程:http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-java-driver/#getting-started ...

  2. 关于怎么C#控制台窗口中怎么创建连接查询数据库操作

    首先需要新建一张表,为了测试随建了一张学生表 新建号一张表之后就可以对数据库进行操作了 列举了常用的增删改查 操作 static void Main(string[] args)        { s ...

  3. Lucene7.1.0版本的索引创建与查询以及维护,包括新版本的一些新特性探索!

    一 吐槽 lucene版本更新实在太快了,往往旧版本都还没学会,新的就出来,而且每个版本改动都特别大,尤其是4.7,6,6,7.1.......ε=(´ο`*)))唉,但不可否认,新版本确实要比旧版本 ...

  4. MySQL索引详解(优缺点,何时需要/不需要创建索引,索引及sql语句的优化)

     一.什么是索引? 索引是对数据库表中的一列或多列值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息. 二.索引的作用? 索引相当于图书上的目录,可以根据目录上的页码快速找到所需的内容,提 ...

  5. Lucene3.6.2包介绍,第一个Lucene案例介绍,查看索引信息的工具lukeall介绍,Luke查看的索引库内容,索引查找过程

    2.Lucene3.6.2包介绍,第一个Lucene案例介绍,查看索引信息的工具lukeall介绍,Luke查看的索引库内容,索引查找过程 2014-12-07 23:39 2623人阅读 评论(0) ...

  6. SQL Server 查询性能优化——创建索引原则(二)

    三:索引的建立原则 一般来说,建立索引要看数据使用的场景,换句话来说哪些访问数据的SQL语句是常用的,而这些语句是否因为缺少索引(也有可能是索引过多)变的效率低下.但绝不是所有的SQL语句都要建立索引 ...

  7. SQL Server 查询性能优化——创建索引原则

    索引是什么?索引是提高查询性能的一个重要工具,索引就是把查询语句所需要的少量数据添加到索引分页中,这样访问数据时只要访问少数索引的分页就可以.但是索引对于提高查询性能也不是万能的,也不是建立越多的索引 ...

  8. mysql索引原理及创建与查询

    索引介绍 一:为什么要有索引 索引是用来优化查询效率(速度)的 没有索引的话,对于大数据的表,就只能每次都遍历一遍,数据量越大,耗时越多有索引的话,可以提升好几个数量级的速度 一般的应用系统,读写比例 ...

  9. ArcGIS Engine 创建索引(属性索引)——提高查询效率

    转自原文 ArcGIS Engine 创建索引(属性索引)——提高查询效率 众所周知,建立索引可以提高查询的效率,当对FeatureClass中的某一列频繁的查找,且数据量比较大时,建立索引是非常有必 ...

随机推荐

  1. [SDOI2016]游戏

    Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,Alice 会 ...

  2. bzoj 5287: [Hnoi2018]毒瘤

    Description Solution \(dfs\) 出一棵生成树之后,多出来的边就都是反祖边了 把反祖边两个端点都拿出来,就会得到最多 \(k=2*(m-n+1)\) 个关键点 除了关键点以外的 ...

  3. 【BZOJ4653】【Noi2016D2】区间

    原题传送门 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就是使得 ...

  4. ●BZOJ 1006 [HNOI2008]神奇的国度(弦图最小染色数)○ZOJ 1015 Fishing Net

    ●赘述题目 给出一张弦图,求其最小染色数. ●题解 网上的唯一“文献”:<弦图与区间图>(cdq),可以学习学习.(有的看不懂) 摘录几个解决改题所需的知识点: ●子图和诱导子图(一定要弄 ...

  5. [bzoj1187][HNOI2007]神奇游乐园

    来自FallDream的博客,未经允许,请勿转载,谢谢, 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细一看,才发现这是一 ...

  6. 安装ipython,使用scrapy shell来验证xpath选择的结果 | How to install iPython and how does it work with Scrapy Shell

    1. scrapy shell 是scrapy包的一个很好的交互性工具,目前我使用它主要用于验证xpath选择的结果.安装好了scrapy之后,就能够直接在cmd上操作scrapy shell了. 具 ...

  7. C++ C# python 中输入输出函数对比

    C++ cin>>"nihao";cout<<"nihao"<<endl; C# System.Console.ReadLi ...

  8. ubuntu上的附件-终端和用快捷键ctrl+alt+f1 有啥区别

    ctrl +alt +Fn 打开的是模拟终端,简单说来,linux系统一开机会自动打开6个模拟终端,然后自动切换到其中一个(一般来说是切换到图形界面的那个也就是说窗口管理器是在这6个模拟终端中运行的) ...

  9. P20 旅行助手,从未有过的至尊私人导游服务!

    旅行可以让人暂时抛掉生活中的琐事,工作上的压力,寻找内心的宁静.有的人是为了想多去见识不同的事物和人文风情,有的人是想去感受大自然的馈赠,看历史古迹感受古人智慧.歌德说过:人之所以爱旅行,不是为了抵达 ...

  10. Mysql中where条件一个单引号引发的性能损耗

    日常写SQL中可能会有一些小细节忽略了导致整个sql的性能下降了好几倍甚至几十倍,几百倍.以下这个示例就是mysql语句中的一个单引号('')引发的性能耗损,我相信很多朋友都遇到过,甚至还在这样写. ...