1 Lucene笔记(一):创建索引库、根据关键字搜索
2016-06-20 10:54
495 查看
package ch.lucene;
import java.io.File;
import java.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.Index;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.store.Directory;
4000
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.util.Version;
import org.junit.Test;
import ch.lucene.entity.Article;
public class FirstLucenne {
/**
* 创建索引库
* 1,创建javabean对象
* 2,创建document对象
* 3,将javabean对象所有属性值,放到document对象中
* 4,创建IndexWrite对象
* 5,将document对象通过Indexwrite写入到索引库中
* 6,关闭IndexWrite对象
**/
[align=left] @Test[/align]
publicvoidcreateIndexDB()
throws
Exception {
// 创建Article对象(id,title,content)
Article
art
= new
Article(1,"标题","搜索标题的内容是什么呢?Lucene学习学习哈哈哈");
[align=left] [/align]
//创建Document对象
Documentdoc
=
newDocument();
//将Article对象中三个属性值绑定到document对象中
/* 参数一:表示document中的 xid属性,与Article中的属性名id相对应,项目中提倡相同
[align=left] * 参数二:document中xid属性的值value,与Article相同[/align]
[align=left] * 参数三:表示是否讲id属性的值存入词汇表中:[/align]
[align=left] Store.YES表示是,[/align]
[align=left] Store.NO表示否,[/align]
[align=left] 项目中提倡非id值都存入词汇表中[/align]
[align=left] * 参数四:是否将xid的属性值进行分词算法[/align]
[align=left] Index.ANALYZED:表示会对该属性值进行词汇拆分[/align]
[align=left] Index.NOT_ANALYZED:表示不会对该属性值进行词汇拆分[/align]
[align=left] 项目中提倡非id属性值都进行词汇拆分[/align]
[align=left] 目前,一个汉字为一个拆分词[/align]
[align=left] */[/align]
doc.add(
new
Field( "id",
art.getId().toString(), Store.YES,
Index.ANALYZED));
doc.add(
new
Field( "title",
art.getTitle(), Store.YES, Index.ANALYZED));
doc.add(
new
Field( "content",
art.getContent(), Store.YES,
Index.ANALYZED));
[align=left] [/align]
//将document对象写入索引库
/* 参数一: Lucene索引库最终对应硬盘的目录。如:E:/LuceneDB
[align=left] * 参数二:采用什么策略将文本拆分,一个策略就是一个具体实现类[/align]
[align=left] * 参数三:最大值[/align]
[align=left] */[/align]
Directorydirectory
= FSDirectory. open(newFile("F:/LuceneDB"))
;
Analyzeranalyzer
=
newStandardAnalyzer(Version.LUCENE_30);
MaxFieldLengthmaxFiledLength
= MaxFieldLength.LIMITED;
IndexWriterindexWriter
=
newIndexWriter(directory,analyzer
,
maxFiledLength);
indexWriter.addDocument(
doc);
indexWriter.close();
[align=left] }[/align]
/**
* 根据关键字搜索
* 1,创建IndexSearcher对象
2,创建QueryParser对象
3,创建Query对象来封装关键字
4,用IndexSearcher对象去索引库中查询符合条件的前100条记录,不足100条记录的以实际为准
5,获取符合条件的编号
6,用indexSearcher对象去索引库中查询编号对应的Document对象
7,将Document对象中的所有属性取出,再封装回JavaBean对象中去,并加入到集合中保存,以备将之用
**/
[align=left] @Test[/align]
publicvoidsearchByKeyword
()throwsException{
String
keyword
= "标题";
[align=left] [/align]
Directorydirectory
= FSDirectory. open(newFile("F:/LuceneDB"))
;
List<Article>list
=
newArrayList<Article>();
Analyzeranalyzer
=
newStandardAnalyzer(Version.LUCENE_30);
[align=left] MaxFieldLengthmaxFiledLength= MaxFieldLength.LIMITED;[/align]
//创建IndexSearcher字符流对象
IndexSearcherindexSearcher
=
newIndexSearcher(directory);
//创建查询解析器对象:参数一,版本号;参数二,针对document对象中 的哪个属性值进行搜索
QueryParserqueryParser
=
newQueryParser(Version.LUCENE_30,
"content"
, analyzer
);
//封装查询关键字
Query
query
= queryParser.parse(
keyword);
//根据关键字,去索引库中的词汇表搜索:参数一,封装关键字;参数二,取出搜索内容钱100条,不足则取实
TopDocs
topDocs
= indexSearcher.search(
query, 100);
//取值
for(
int
i=0;
i<
topDocs.
scoreDocs.
length;
i++){
//取出封装封装编号和分数的对象
ScoreDocscoreDoc
=
topDocs.scoreDocs[i];
//取编号
int
no =
scoreDoc.
doc;
//根据编号去索引库里面搜索document对象
Documentdoc
=
indexSearcher.doc(no);
//取出document对象中的三个属性值
Stringid
=
doc.get("id");
Stringtitle
=
doc.get("title");
Stringcontent
=
doc.get("content");
//封装到Article对象中
Articlearticle
=
newArticle(Integer.parseInt(id),title,content);
//将article对象加入到list集合中
list.add(
article);
[align=left] }[/align]
//迭代结果
for(Article
a
: list){
System.
out.println(a);
[align=left] } [/align]
[align=left] }[/align]
[align=left]}[/align]
import java.io.File;
import java.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.Index;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.store.Directory;
4000
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.util.Version;
import org.junit.Test;
import ch.lucene.entity.Article;
public class FirstLucenne {
/**
* 创建索引库
* 1,创建javabean对象
* 2,创建document对象
* 3,将javabean对象所有属性值,放到document对象中
* 4,创建IndexWrite对象
* 5,将document对象通过Indexwrite写入到索引库中
* 6,关闭IndexWrite对象
**/
[align=left] @Test[/align]
publicvoidcreateIndexDB()
throws
Exception {
// 创建Article对象(id,title,content)
Article
art
= new
Article(1,"标题","搜索标题的内容是什么呢?Lucene学习学习哈哈哈");
[align=left] [/align]
//创建Document对象
Documentdoc
=
newDocument();
//将Article对象中三个属性值绑定到document对象中
/* 参数一:表示document中的 xid属性,与Article中的属性名id相对应,项目中提倡相同
[align=left] * 参数二:document中xid属性的值value,与Article相同[/align]
[align=left] * 参数三:表示是否讲id属性的值存入词汇表中:[/align]
[align=left] Store.YES表示是,[/align]
[align=left] Store.NO表示否,[/align]
[align=left] 项目中提倡非id值都存入词汇表中[/align]
[align=left] * 参数四:是否将xid的属性值进行分词算法[/align]
[align=left] Index.ANALYZED:表示会对该属性值进行词汇拆分[/align]
[align=left] Index.NOT_ANALYZED:表示不会对该属性值进行词汇拆分[/align]
[align=left] 项目中提倡非id属性值都进行词汇拆分[/align]
[align=left] 目前,一个汉字为一个拆分词[/align]
[align=left] */[/align]
doc.add(
new
Field( "id",
art.getId().toString(), Store.YES,
Index.ANALYZED));
doc.add(
new
Field( "title",
art.getTitle(), Store.YES, Index.ANALYZED));
doc.add(
new
Field( "content",
art.getContent(), Store.YES,
Index.ANALYZED));
[align=left] [/align]
//将document对象写入索引库
/* 参数一: Lucene索引库最终对应硬盘的目录。如:E:/LuceneDB
[align=left] * 参数二:采用什么策略将文本拆分,一个策略就是一个具体实现类[/align]
[align=left] * 参数三:最大值[/align]
[align=left] */[/align]
Directorydirectory
= FSDirectory. open(newFile("F:/LuceneDB"))
;
Analyzeranalyzer
=
newStandardAnalyzer(Version.LUCENE_30);
MaxFieldLengthmaxFiledLength
= MaxFieldLength.LIMITED;
IndexWriterindexWriter
=
newIndexWriter(directory,analyzer
,
maxFiledLength);
indexWriter.addDocument(
doc);
indexWriter.close();
[align=left] }[/align]
/**
* 根据关键字搜索
* 1,创建IndexSearcher对象
2,创建QueryParser对象
3,创建Query对象来封装关键字
4,用IndexSearcher对象去索引库中查询符合条件的前100条记录,不足100条记录的以实际为准
5,获取符合条件的编号
6,用indexSearcher对象去索引库中查询编号对应的Document对象
7,将Document对象中的所有属性取出,再封装回JavaBean对象中去,并加入到集合中保存,以备将之用
**/
[align=left] @Test[/align]
publicvoidsearchByKeyword
()throwsException{
String
keyword
= "标题";
[align=left] [/align]
Directorydirectory
= FSDirectory. open(newFile("F:/LuceneDB"))
;
List<Article>list
=
newArrayList<Article>();
Analyzeranalyzer
=
newStandardAnalyzer(Version.LUCENE_30);
[align=left] MaxFieldLengthmaxFiledLength= MaxFieldLength.LIMITED;[/align]
//创建IndexSearcher字符流对象
IndexSearcherindexSearcher
=
newIndexSearcher(directory);
//创建查询解析器对象:参数一,版本号;参数二,针对document对象中 的哪个属性值进行搜索
QueryParserqueryParser
=
newQueryParser(Version.LUCENE_30,
"content"
, analyzer
);
//封装查询关键字
Query
query
= queryParser.parse(
keyword);
//根据关键字,去索引库中的词汇表搜索:参数一,封装关键字;参数二,取出搜索内容钱100条,不足则取实
TopDocs
topDocs
= indexSearcher.search(
query, 100);
//取值
for(
int
i=0;
i<
topDocs.
scoreDocs.
length;
i++){
//取出封装封装编号和分数的对象
ScoreDocscoreDoc
=
topDocs.scoreDocs[i];
//取编号
int
no =
scoreDoc.
doc;
//根据编号去索引库里面搜索document对象
Documentdoc
=
indexSearcher.doc(no);
//取出document对象中的三个属性值
Stringid
=
doc.get("id");
Stringtitle
=
doc.get("title");
Stringcontent
=
doc.get("content");
//封装到Article对象中
Articlearticle
=
newArticle(Integer.parseInt(id),title,content);
//将article对象加入到list集合中
list.add(
article);
[align=left] }[/align]
//迭代结果
for(Article
a
: list){
System.
out.println(a);
[align=left] } [/align]
[align=left] }[/align]
[align=left]}[/align]
相关文章推荐
- 网络游戏同步问题
- 改了计算机名后,sqlserver进行发布订阅时,提示此实例上未安装复制组件
- Java关键字final、static使用总结
- Centos 7 (linux)部署MongoDB
- Android中补间动画的基本使用
- ios swift例子源码网址总结
- code1225 搭积木
- android线程操作类(暂停、重新开启、停止)
- ios swift例子源码网址总结
- 【FOL】第二周
- 通用经验:大企业如何逆势而上
- js时间字符串转时间戳
- 探寻C++最快的读取文件的方案
- STL源码剖析——stl_algobase.h
- struts2的文件上传与下载
- go语言学习之路 二:变量
- 福耀经验:如何把利润做到最大化
- java线程和进程
- BZOJ4204 取球游戏
- 用Allway sync设置实现“快盘”功能