4.Lucene3.案例介绍,创建索引,查询等操作验证



  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();

}

}

时间: 2024-12-29 11:51:01

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

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

首先需要新建一张表,为了测试随建了一张学生表 新建号一张表之后就可以对数据库进行操作了 列举了常用的增删改查 操作 static void Main(string[] args)        { string str1="";            SqlConnection sqlcon = new SqlConnection("Data Source=.;Initial Catalog=db_user;Persist Security Info=True;User ID

一、创建索引之代码开发

jar包: Lucene包: lucene-core-4.10.3.jar lucene-analyzers-common-4.10.3.jar lucene-queryparser-4.10.3.jar 其它: commons-io-2.4.jar junit-4.9.jar package com.itheima.lucene; import java.io.File; import java.io.IOException; import org.apache.commons.io.File

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

三:索引的建立原则 一般来说,建立索引要看数据使用的场景,换句话来说哪些访问数据的SQL语句是常用的,而这些语句是否因为缺少索引(也有可能是索引过多)变的效率低下.但绝不是所有的SQL语句都要建立索引,如果所有的SQL语句都建立索引,那么可能导致建立过多的索引. 我碰到过每秒钟新增记录超过千条的案例,虽然该数据表仅有聚集索引,但因为已存在的键值字段的值和新增数据键值字段的值并不是按顺序递增,每次新增记录时,肯定造成整体数据行的重新排列.在移掉聚集索引后,性能约提升20%.也曾经碰到过一个数据表上

基于lucene的案例开发:创建索引

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/42872711 从这篇博客开始,不论是API介绍还是后面的案例开发,都是基于 lucene4.3.1 这个版本,Lucene4.3.1 下载请点击这里, Lucene其他版本下载请点击这里,Lucene4.3.1官方API文档请点击这里. 创建索引demo 在开始介绍之前,先看一个简单的索引创建demo程序: /** *@Description: 索引创建demo */ pack

大数据技术之_20_Elasticsearch学习_01_概述 + 快速入门 + Java API 操作 + 创建、删除索引 + 新建、搜索、更新删除文档 + 条件查询 + 映射操作

一 概述1.1 什么是搜索?1.2 如果用数据库做搜索会怎么样?1.3 什么是全文检索和 Lucene?1.4 什么是 Elasticsearch?1.5 Elasticsearch 的适用场景1.6 Elasticsearch 的特点1.7 Elasticsearch 的核心概念1.7.1 近实时1.7.2 Cluster(集群)1.7.3 Node(节点)1.7.4 Index(索引 --> 数据库)1.7.5 Type(类型 --> 表)1.7.6 Document(文档 -->

lucene-5.1.0 索引的创建与查询 demo

lucene以及solr作为索引工具已经被广泛使用,以前项目中也有用到过lucene4.x,如今lucene版本已经到5.1了,再次了解一下,来写个demo! 首先附一下文档及下载地址: a:下载地址 Lucene下载 b:文档地址 lucene API 所需jar包(只附lucene相关jar): lucene-analyzers-common-5.1.0.jar lucene-core-5.1.0.jar lucene-queries-5.1.0.jar lucene-queryparser

对于大量left join 的表查询,可以在关键的 连接节点字段上创建索引。

问题: 大量的left join 怎么优化 select a.id,a.num,b.num,b.pcs,c.num, c.pcs,d.num,d.pcs,e.num,e.pcs,a.x, a.y from a left join b.id=a.id and b.time=a.time left join c.id=a.id and b.time=a.time left join d.id=a.id and b.time=a.time left join e.id=a.id and b.time=

lucenc.net 全文检索 创建索引、 查询、分页

#region 创建.跟新词库 /// <summary> /// 创建.跟新词库 /// </summary> private void CreateIndexData() { //索引库文件夹 FSDirectory dir = FSDirectory.Open(new DirectoryInfo(path), new NativeFSLockFactory()); //是否存在索引库 bool has = IndexReader.IndexExists(dir); if (h

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

索引是什么?索引是提高查询性能的一个重要工具,索引就是把查询语句所需要的少量数据添加到索引分页中,这样访问数据时只要访问少数索引的分页就可以.但是索引对于提高查询性能也不是万能的,也不是建立越多的索引就越好.索引建少了,用WHERE子句找数据效率低,不利于查找数据.索引建多了,不利于新增.修改和删除等操作,因为做这些操作时,SQL SERVER除了要更新数据表本身,还要连带地立即更新所有的相关索引,而且过多的索引也会浪费硬盘空间.因此要建得恰到好处,这就需要经验了. 一:索引的基本目的 索引的基