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