
jun - 云代码空间
—— 相信 ,梦
爬虫 是所有搜索引擎 基础
用途一: 应用软件 (word 、 window操作系统、 myeclipse )
用途二: 贴吧、 论坛、 博客 (对于文章的搜索 ) ---- 最常见应用
用途三: 站内搜索 (京东 搜索商品、 51job 搜索招聘信息 ) --- 应用非常广
用途四: 专业搜索 (垂直领域搜索 818 工作网、 搜索引擎 baidu、google )
信息搜索的过程
第一步: 构建文本库 (对各种各样被搜索资源,提取文本信息 )
第二步: 对文本信息 建立索引
第三步: 结合索引 完成搜索
第四步: 对搜索结果排序显示
传统线性查找一个10MB的word文件,查找关键字如果在文档最后,大约3秒钟
倒排索引, 类似一本书的目录, 索引技术,是一项优化技术 ,提高查找速度
问题: 什么是lucene ?
Apache 提高 一套用于 进行全文信息检索java框架 (开源免费 )
Lucene 不是搜索引擎, 不可以直接当做软件或者产品使用 ,使用lucene 开发搜索引擎
问题: 什么是全文检索 ?
计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,
当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式
强调,对文本信息中的每一个词,建立索引--------全文检索(全文索引)
Lucene 是全文索引 工具
官网:http://lucene.apache.org/ 下载开发jar包
企业使用lucene , 下载lucene (最新版本4.9 )、 下载 solr (是基于lucene搜索服务器 )
导入jar 到工程
package cn.itcast.lucene;
import javax.persistence.Entity;
public class Article {
private String id;// 编号
private String title;// 标题
private String content;// 内容
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
将对象数据 转换为Document (不管是什么数据,lucene只能操作Document)
需要使用Fieldable接口实现类 Field 构造
Field.Store 用来设置当前属性是否存放到索引库中 (搜索的结果)
Field.Index 用来设置当前属性是否索引库 建立索引 (搜索的过程)
import java.io.File;
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.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.util.Version;
import org.junit.Test;
public class LuceneDemo {
@Test
public void textLucene() throws Exception {
// 针对 文章数据建立索引
// 1、文本数据
Article article = new Article();
article.setId("100");
article.setTitle("lucene简介");
article.setContent("Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构");
// 2、 将文本数据 --- 转换 Document对象
// 一个document 对应一篇文章
Document document = new Document();
// 对document 添加数据
document.add(new Field("id", article.getId(), Store.YES, Index.NO));
document.add(new Field("title", article.getTitle(), Store.NO, Index.ANALYZED));
document.add(new Field("content", article.getContent(), Store.YES, Index.ANALYZED));
// 建立索引
// 设置索引文件位置
Directory directory = FSDirectory.open(new File("index"));
// 设置索引分词器
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);
// 建立indexWriterConfig
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_36, analyzer);
// 建立indexwriter
IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);
// 建立索引
indexWriter.addDocument(document);
indexWriter.close();
}
public void testSearchIndex() throws Exception {
// 1、 用户输入一个搜索的词
String searchContent = "jakarta项目";
// 2、设置索引目录、分词器
Directory directory = FSDirectory.open(new File("index"));
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);
// 3、构建Query对象
QueryParser queryParser = new QueryParser(Version.LUCENE_36, "content", analyzer);
Query query = queryParser.parse(searchContent);
// 4、通过 IndexSearcher 对象,结合 Query完成查询
IndexSearcher indexSearcher = new IndexSearcher(IndexReader.open(directory));
TopDocs topDocs = indexSearcher.search(query, 100000000);
// 搜索到实际结果数
System.out.println("搜索到" + topDocs.totalHits + "个结果");
// 获取结果内容 Document
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
System.out.println("文档得分:" + scoreDoc.score);
// 获取具体Document对象
int documentId = scoreDoc.doc;
Document document = indexSearcher.doc(documentId);
// 通过 Field的name 获取属性的值
System.out.println("id:" + document.get("id"));
System.out.println("title:" + document.get("title"));
System.out.println("content:" + document.get("content"));
}
// 释放资源
indexSearcher.close();
}
}