Lucene全文检索

Lucene

 
Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个 开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分 文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。 Lucene是一套用于 全文检索和搜寻的开源程式库,由 Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费 开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与 搜索引擎相混淆。
    

倒排索引

问题:什么是倒排索引?

         说明:查询方式发生变化,先查询索引文件,在根据索引查询文件的位置,最终实现文件的查询.

         传统的检索方式:

                            以文章为例,如果需要在百度中查询一片文章,如果按照文章的内容来查询.则传统的手段是先加载全部的文章之后循环遍历直到找到符合的文章为止.

        缺点:查询的速度特别慢,资源浪费严重


数据结构:二叉树, B+树,B-树

jar包   <!-- 全文检索lucene -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>4.10.2</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>4.10.2</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>4.10.2</version>
</dependency>

<!-- IK分词器 -->
<dependency>
<groupId>org.wltea.analyzer</groupId>
<artifactId>ik-analyzer</artifactId>
<version>2012FF_u1</version>
</dependency>

<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>5.2.1</version>
</dependency>


<!-- 爬虫jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.9.1</version>

</dependency>


测试代码

        public class TestSolr {

/**
* 全文检索的流程
*  1,为给定的字段创建索引文件
*  2,当用户进行查询时,根据索引获取具体的文件
*  
* @throws IOException
*/

@Test
public void test01() throws IOException{
//创建索引文件存放目录         会在当前工程下建立index目录
Directory directory = FSDirectory.open(new File("./index"));
//定义分词器   定义标准分词器
//Analyzer analyzer = new StandardAnalyzer();

//切换中文分词器
//Analyzer analyzer = new ChineseAnalyzer();

Analyzer analyzer = new IKAnalyzer();
//创建配置文件    定义版本号      
IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_4_10_2, analyzer);
//创建索引文件
IndexWriter indexWriter = new IndexWriter(directory, conf);
//创建文档对象:
Document document = new  Document();
/**
* 参数名称:  
* id :属性字段名称      value值     Store 表示是否存储   yes表示存入
*/
document.add(new LongField("id", 5025991L, Store.YES));
document.add(new TextField("title", "vivo X20 全面屏双摄拍照手机 4GB+64GB 磨砂黑 移动联通电信全网通4G手机 双卡双待 ", Store.YES));
document.add(new TextField("sellPoint", "游戏免打扰,畅快体验,带你吃鸡、上王者!高清全面屏,尊享Hi-Fi音质,更有面部识别+指纹双解锁!", Store.YES));
document.add(new DoubleField("price", 2988.00, Store.YES));
document.add(new TextField("itemDesc", "分辨率:2160*1080分辨后置摄像头:2x1200万像素+500万像素(2400万感光单元)前置摄像头:2x1200万像素(2400万感光单元) 核      数:八核", Store.YES));
//将索引文件写入到文档中
indexWriter.addDocument(document);
indexWriter.close();
}

@Test
public void seracher() throws IOException{
Directory directory = FSDirectory.open(new File("./index"));
//创建检索文件
IndexSearcher indexSearcher = new IndexSearcher(IndexReader.open(directory));
//创建查询条件   Term表示分组
Query query = new TermQuery(new Term("title", "手机"));
//查询  results 表示最顶端的20条记录数
TopDocs docs  = indexSearcher.search(query, 20);
//访问总数
System.out.println("数据访问的总数:"+docs.totalHits);
//获取文章的得分
for ( ScoreDoc scoreDoc : docs.scoreDocs) {
System.out.println("获取文章的得分:"+scoreDoc.score);  //分数越高 越靠前
int index = scoreDoc.doc; //获取索引值
//获取文章内容     
Document document = indexSearcher.doc(index);
//输出文章内容
System.out.println("标题:"+document.get("title"));
System.out.println("卖点:"+document.get("sellPoint"));
System.out.println("价格:"+document.get("price"));
System.out.println("描述信息:"+document.get("itemDesc"));
}
directory.close();

}
}



总结:lucene只能够为一些简单的数据创建索引文件,



        














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值