1. Lucene:它一个全世界最流行的,开源的全文检索框架。
2. 我们用Lucene做什么:
网上商城:按产品的名称,产品的描述进行搜索。
oa: 公文管理, 搜索"放假" 关键字。
3. Lucene主要用站内检索,网站内的检索。
4. 单独的Lucene是做了互联网的搜索引擎,因为还需要"网络蜘蛛"、【海量数据】管理。
网络蜘蛛: 负责所有的网站、所有网页之间的"爬动", 它会把爬到的信息存储到数据库中。
5. 什么是全文检索:根据你检索的要求,在文档中检索。
一、Lucene的安装:
1. core: 核心部分.
2. analysis: 分词部分。
3. highlighter: 高亮部分。
4. queryparser: 查询。
5. docs: api部分。
二、创建索引库。
创建索引库的步骤:
1. 创建IndexWriter对象
IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);
第一参数(directory): 指定索引库存储的位置
Directory它的子类:
FSDirectory : 存放在磁盘上.
RAMDirectory : 内存中.
第二个参数(indexWriterConfig):指定创建索引需要的额外的信息。
indexWriterConfig config = new IndexWriterConfig(version|版本, analyzer|分词器);
config.setOpenMode(CREATE| APPEND | CREARE_OR_APPEND);
2. 调用indexWriter添加文档:
// 循环添加Document
Document doc = new Document();
doc.add(Field);
indexWriter.addDocument(Document);
indexWriter.commit(); //提交
indexWriter.close(); // 关闭
常用的API:
a. IndexWriter : 对索引库CUD操作
b. Directory : 目录
-- FSDirectory (文件目录)
-- NIOFSDirectory
-- SimpleFSDirectory
静态的方法:FSDirectory.open(file);
-- RAMDirectory
查询索引时用这个效率会高些。
c. IndexWriterConfig : 创建索引额外的信息
方法setOpenMode(): 指定打开索引库的模式。
-- OpenMode.CREATE : 创建
-- OpenMode.APPEND : 追加
-- OpenMode.CREATE_OR_APPEND : 创建或追加
d. Analyzer : 分词器
e. Document : 文档
f. Field : 字段
常用到得子类
-- DoubleField
-- FloatField
-- IntField
-- LongField
-- StoredField (只存储,不分词,也不索引)
-- StringField 不分词(主键)
-- TextField
new Field("字段名称", "字段值", "是否存储")
Store.YES : 存储
Store.NO: 不存储
三、查询|检索。
操作步骤:
1. 创建IndexSearcher
// 索引库存储的目录
Directory directory = FSDirectory.open(new File("F:/lucene_index"));
IndexReader indexReader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(indexReader);
2. 调用IndexSearcher方法进行检索
Query query = new TermQuery(new Term("field", "keyword"));
TopDocs topDocs = indexSearcher.search(query, "记录条数");
topDocs.totalHits : 检索到的总条数
topDocs.scoreDocs : 检索到的文档数组.
3. 迭代ScoreDoc[]数组
int docId = scoreDoc.doc; // 文档的编号
Document doc = searcher.doc(docId);
doc.get("字段名")
常用API:
a. IndexSearcher : 搜索对象
-- search(query, num)
query: Query的子类
num : 查询的记录条数。
-- doc(docId): 获取文档
b. IndexReader : 读索引库的对象
c. DirectoryReader : 目录读取对象
-- DirectoryReader.open(directory)
d. TopDocs
-- totalHits : 检索到的总条数
-- scoreDocs : 检索到的文档数组.
e. ScoreDoc
-- doc : 文档的编号
四、分词处理.
1. 英文分词按空格分成若干个单词: i love you
2. 中文分词(Lucene自带的分词器):
a. 单字分词(StandardAnalyzer): 中华人民共和国 (中|华|人|民|共|和|国 )
b. 二分法分词(CJKAnalyzer): 中华人民共和国 (中华|华人|人民|民共|共和|和国)
c. 词库分词(SmartChineseAnalyzer):需要宠大的词库。(这个比较好用)
3. 去掉停用词: (stop word)
is、a、an、the、of、for、的、地、吗、得、嘛、哦、了、呢.
4. 英文大写全部小写。
5. 英文还原词根: cars : car
6. 加停用词。
7. 第三方的开源的分词器.
a. ik-analyzer
b. mmseg4j
五、对索相库进行维护(CRUD)
indexWriter : CUD操作
-- indexWriter.addDocument(); // 添加
-- indexWriter.updateDocument(term, doc); // 修改
-- indexWriter.deleteDocuments(term); // 删除
indexReader : 对索引库做查询操作
-- numDocs()| maxDoc() : 获取总文档数
Document doc = indexReader.document(i); // 根据索引号获取文档.
indexSearcher: 对索引库做搜索操作
六、Query创建的方式
1. 第一种创建Query的方式 (Query的子类)
TermQuery : 关键字查询
WildcardQuery : 通匹符查询
PrefixQuery : 前缀查询
FuzzyQuery : 模糊查询
RegexpQuery : 正则表达式查询
BooleanQuery : 布尔查询
PhraseQuery : 短语查询 (添加的关键字是并且关系)
MultiPhraseQuery : 多短语查询 (添加的数组中关键字是或者关系)
MultiPhraseQuery ph = new MultiPhraseQuery();
2. 我们用Lucene做什么:
网上商城:按产品的名称,产品的描述进行搜索。
oa: 公文管理, 搜索"放假" 关键字。
3. Lucene主要用站内检索,网站内的检索。
4. 单独的Lucene是做了互联网的搜索引擎,因为还需要"网络蜘蛛"、【海量数据】管理。
网络蜘蛛: 负责所有的网站、所有网页之间的"爬动", 它会把爬到的信息存储到数据库中。
5. 什么是全文检索:根据你检索的要求,在文档中检索。
一、Lucene的安装:
1. core: 核心部分.
2. analysis: 分词部分。
3. highlighter: 高亮部分。
4. queryparser: 查询。
5. docs: api部分。
二、创建索引库。
创建索引库的步骤:
1. 创建IndexWriter对象
IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);
第一参数(directory): 指定索引库存储的位置
Directory它的子类:
FSDirectory : 存放在磁盘上.
RAMDirectory : 内存中.
第二个参数(indexWriterConfig):指定创建索引需要的额外的信息。
indexWriterConfig config = new IndexWriterConfig(version|版本, analyzer|分词器);
config.setOpenMode(CREATE| APPEND | CREARE_OR_APPEND);
2. 调用indexWriter添加文档:
// 循环添加Document
Document doc = new Document();
doc.add(Field);
indexWriter.addDocument(Document);
indexWriter.commit(); //提交
indexWriter.close(); // 关闭
常用的API:
a. IndexWriter : 对索引库CUD操作
b. Directory : 目录
-- FSDirectory (文件目录)
-- NIOFSDirectory
-- SimpleFSDirectory
静态的方法:FSDirectory.open(file);
-- RAMDirectory
查询索引时用这个效率会高些。
c. IndexWriterConfig : 创建索引额外的信息
方法setOpenMode(): 指定打开索引库的模式。
-- OpenMode.CREATE : 创建
-- OpenMode.APPEND : 追加
-- OpenMode.CREATE_OR_APPEND : 创建或追加
d. Analyzer : 分词器
e. Document : 文档
f. Field : 字段
常用到得子类
-- DoubleField
-- FloatField
-- IntField
-- LongField
-- StoredField (只存储,不分词,也不索引)
-- StringField 不分词(主键)
-- TextField
new Field("字段名称", "字段值", "是否存储")
Store.YES : 存储
Store.NO: 不存储
三、查询|检索。
操作步骤:
1. 创建IndexSearcher
// 索引库存储的目录
Directory directory = FSDirectory.open(new File("F:/lucene_index"));
IndexReader indexReader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(indexReader);
2. 调用IndexSearcher方法进行检索
Query query = new TermQuery(new Term("field", "keyword"));
TopDocs topDocs = indexSearcher.search(query, "记录条数");
topDocs.totalHits : 检索到的总条数
topDocs.scoreDocs : 检索到的文档数组.
3. 迭代ScoreDoc[]数组
int docId = scoreDoc.doc; // 文档的编号
Document doc = searcher.doc(docId);
doc.get("字段名")
常用API:
a. IndexSearcher : 搜索对象
-- search(query, num)
query: Query的子类
num : 查询的记录条数。
-- doc(docId): 获取文档
b. IndexReader : 读索引库的对象
c. DirectoryReader : 目录读取对象
-- DirectoryReader.open(directory)
d. TopDocs
-- totalHits : 检索到的总条数
-- scoreDocs : 检索到的文档数组.
e. ScoreDoc
-- doc : 文档的编号
四、分词处理.
1. 英文分词按空格分成若干个单词: i love you
2. 中文分词(Lucene自带的分词器):
a. 单字分词(StandardAnalyzer): 中华人民共和国 (中|华|人|民|共|和|国 )
b. 二分法分词(CJKAnalyzer): 中华人民共和国 (中华|华人|人民|民共|共和|和国)
c. 词库分词(SmartChineseAnalyzer):需要宠大的词库。(这个比较好用)
3. 去掉停用词: (stop word)
is、a、an、the、of、for、的、地、吗、得、嘛、哦、了、呢.
4. 英文大写全部小写。
5. 英文还原词根: cars : car
6. 加停用词。
7. 第三方的开源的分词器.
a. ik-analyzer
b. mmseg4j
五、对索相库进行维护(CRUD)
indexWriter : CUD操作
-- indexWriter.addDocument(); // 添加
-- indexWriter.updateDocument(term, doc); // 修改
-- indexWriter.deleteDocuments(term); // 删除
indexReader : 对索引库做查询操作
-- numDocs()| maxDoc() : 获取总文档数
Document doc = indexReader.document(i); // 根据索引号获取文档.
indexSearcher: 对索引库做搜索操作
六、Query创建的方式
1. 第一种创建Query的方式 (Query的子类)
TermQuery : 关键字查询
WildcardQuery : 通匹符查询
PrefixQuery : 前缀查询
FuzzyQuery : 模糊查询
RegexpQuery : 正则表达式查询
BooleanQuery : 布尔查询
PhraseQuery : 短语查询 (添加的关键字是并且关系)
MultiPhraseQuery : 多短语查询 (添加的数组中关键字是或者关系)
MultiPhraseQuery ph = new MultiPhraseQuery();