您的位置:首页 > 其它

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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: