lucene 快速入门
日常开发中,相信大家经常会用like去匹配一些数据,同时我们也知道,like往往会导致全表扫描,当数据量越来越大的时候,我们会纠结于
数据库的龟速查找,此时我们必须另寻蹊跷,这时lucene就可以大显身手了。
首先我们做一个demo,向数据库中插入10w条数据,总共778M。
接下来,我们搜索下新闻内容中包含“流行”的记录。
mmd,检索一下要78s,是谁都要砸了面前的破机子。
下面我们来看看lucene的效果怎么样。下载地址:http://incubator.apache.org/lucene.net/download.html
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using Lucene.Net.Index;
6 using Lucene.Net.Store;
7 using Lucene.Net.Analysis.Standard;
8 using Lucene.Net.Documents;
9 using System.Data;
10 using System.Diagnostics;
11 using Lucene.Net.Search;
12
13 using Lucene.Net.QueryParsers;
14
15 namespace First
16 {
17 class Program
18 {
19 static string path = @"D:\Sample";
20
21 static void Main(string[] args)
22 {
23 //创建索引
24 CreateIndex();
25
26 var watch = Stopwatch.StartNew();
27
28 //搜索
29 IndexSearcher search = new IndexSearcher(path);
30
31 //查询表达式
32 QueryParser query = new QueryParser(string.Empty, new StandardAnalyzer());
33
34 //query.parse:注入查询条件
35 var hits = search.Search(query.Parse("Content:流行"));
36
37 for (int i = 0; i < hits.Length(); i++)
38 {
39 Console.WriteLine("当前内容:{0}", hits.Doc(i).Get("Content").Substring(0, 20) + "...");
40 }
41
42 watch.Stop();
43
44 Console.WriteLine("搜索耗费时间:{0}", watch.ElapsedMilliseconds);
45 }
46
47 static void CreateIndex()
48 {
49 //创建索引库目录
50 var directory = FSDirectory.GetDirectory(path, true);
51
52 //创建一个索引,采用StandardAnalyzer对句子进行分词
53 IndexWriter indexWriter = new IndexWriter(directory, new StandardAnalyzer());
54
55 var reader = DbHelperSQL.ExecuteReader("select * from News");
56
57 while (reader.Read())
58 {
59 //域的集合:文档,类似于表的行
60 Document doc = new Document();
61
62 //要索引的字段
63 doc.Add(new Field("ID", reader["ID"].ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
64 doc.Add(new Field("Title", reader["Title"].ToString(), Field.Store.NO, Field.Index.ANALYZED));
65 doc.Add(new Field("Content", reader["Content"].ToString(), Field.Store.YES, Field.Index.ANALYZED));
66
67 indexWriter.AddDocument(doc);
68 }
69
70 reader.Close();
71
72 //对索引文件进行优化
73 indexWriter.Optimize();
74
75 indexWriter.Close();
76 }
77 }
78 }
我靠,448ms,顿时78s黯然失色,当然这个时间是不包含"创建索引“的时间,从时间复杂度上来说,这种预加载索引算是常量。
作为入门,简单的介绍下lucene的实现过程,首先lucene主要分成两步:"索引"和"搜索"。
一:索引:
相信大家对索引还是比较熟悉的,lucene能够将我们内容切分成很多词,然后将词作为key,建立“倒排索引”,然后放到索引库中,在上面
的例子中,我们看到了索引过程中使用到了IndexWriter,FSDirectory,StandardAnalyzer,Document和Field这些类,下面简要分析下。
1:IndexWriter
我们看到该类有一个AddDocument方法,所以我们认为该类实现了索引的写入操作。
2:FSDirectory
这个就更简单了,提供了索引库的存放位置,比如我们这里的D:\Sample,或许有人问,能不能存放在内存中,在强大的lucene面前当然
可以做到,lucene中的RAMDirectory就可以实现,当然我们的内存足够大的话,还是可以用内存承载索引库,进而提高搜索的效率。
3:StandardAnalyzer
这个算是索引过程中最最关键的一步,也是我们使用lucene非常慎重考虑的东西,之所以我们能搜索秒杀,关键在于我们如何将输入的内容
进行何种形式的切分,当然不同的切分形式诞生了不同的分析器,StandardAnalyzer就是一个按照单字分词的一种分析器,详细的介绍后续文
章分享。
4:Document
在上面的例子可以看到,他是承载field的集合,然后添加到IndexWriter中,有点类似表中的行的概念。
5: Field
提供了对要分析的字段进行何种处理,以KV形式呈现。
①:Field.Store.YES, Field.Index.NOT_ANALYZED 表示对索引字段采取:原样保存并且不被StandardAnalyzer进行切分。
②: Field.Store.NO, Field.Index.ANALYZED 不保存但是要被StandardAnalyzer切分。
二:搜索
这个比较容易,根据我们输入的词lucene能够在索引库中快速定位到我们要找的词,同样我们可以看到IndexSearcher,QueryParser,Hits。
1:IndexSearcher
这个我们可以理解成以只读的形式打开由IndexWriter创建的索引库,search给QueryParser提供了查询的桥梁。
2:QueryParser
这玩意提供了一个parse方法能够将我们要查找的词转化为lucene能够理解了查询表达式。
3:Hits
这个就是获取匹配结果的一个指针,优点类似C#中的延迟加载,目的都是一样,提高性能。
http://www.cnblogs.com/huangxincheng/archive/2012/05/13/2497738.html
lucene 快速入门的更多相关文章
- 1.搜索引擎的历史,搜索引擎起步,发展,繁荣,搜索引擎的原理,搜索技术用途,信息检索过程,倒排索引,什么是Lucene,Lucene快速入门
一: 1 搜索引擎的历史 萌芽:Archie.Gopher Archie:搜索FTP服务器上的文件 Gopher:索引网页 2 起步:Robot(网络机器人)的出现与spider(网络爬虫) ...
- Lucene快速入门
1. 什么是lucene lucene是Apache的一个全文检索工具,使用lucene能快速实现全文检索功能.Lucene是一个工具包,你可以调用它的函数, 但它不能独立运行,不单独对外提供服务. ...
- Solr快速入门
1. 什么是Solr Solr是基于lucene的全文检索服务器.不同于lucene工具包,solr是一个web应用,运行在servlet容器,屏蔽了底层细节,并对外提供服务. 点我lucene快速入 ...
- Lucene第一篇【介绍Lucene、快速入门】
什么是Lucene?? Lucene是apache软件基金会发布的一个开放源代码的全文检索引擎工具包,由资深全文检索专家Doug Cutting所撰写,它是一个全文检索引擎的架构,提供了完整的创建索引 ...
- 【转载】Lucene.Net入门教程及示例
本人看到这篇非常不错的Lucene.Net入门基础教程,就转载分享一下给大家来学习,希望大家在工作实践中可以用到. 一.简单的例子 //索引Private void Index(){ Index ...
- 【solr专题之一】Solr快速入门
一.Solr学习相关资料 1.官方材料 (1)快速入门:http://lucene.apache.org/solr/4_9_0/tutorial.html,以自带的example项目快速介绍发Solr ...
- Elasticsearch【快速入门】
前言:毕设项目还要求加了这个做大数据搜索,正好自己也比较感兴趣,就一起来学习学习吧! Elasticsearch 简介 Elasticsearch 是一个分布式.RESTful 风格的搜索和数据分析引 ...
- Elastic 技术栈之快速入门
Elastic 技术栈之快速入门 概念 ELK 是什么 ELK 是 elastic 公司旗下三款产品 ElasticSearch .Logstash .Kibana 的首字母组合. ElasticSe ...
- Hadoop生态圈-大数据生态体系快速入门篇
Hadoop生态圈-大数据生态体系快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.大数据概念 1>.什么是大数据 大数据(big data):是指无法在一定时间 ...
随机推荐
- 【2017-05-19】WebForm复合控件、用DropDownList实现时间日期选择。
自动提交的属性: AutoPostBack="True" 1.RadioButtonList 单选集合 -属性:RepeatDirection:Vertical (垂直排布 ...
- 使用函数rand5()来实现函数rand7()
题目: 给定一个函数rand5(),该函数可以随机生成1-5的整数,且生成概率一样.现要求使用该函数构造函数rand7(),使函数rand7()可以随机等概率的生成1-7的整数. 思路: 很多人的第一 ...
- java 权限控制
网上或参考书中,对于java权限控制大多给出一张看似很整齐很好记实则不好理解的表格,我整理了一个2.0升级版,自认为会好理解很多,希望可以有所帮助. 同一包内 不同包内 修饰符 当前类 非当前类(含子 ...
- django 百度分页算法
效果如下: 脚本: 1. 脚本结构 2.pagination.py from django.utils.safestring import mark_safe class Page: ''' curr ...
- 系列文章--Python Web编程
我从网上找到了其他园友的文章,很不错,留着自己学习学习. Python Web编程(一)Python Web编程(二)Python Web编程(三)Python Web编程(四)Python Web编 ...
- 第六章 组件 60 组件切换-应用切换动画和mode方式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- Java-判断是否为回文数
/** * @ClassName: IsPalindrome * @author: bilaisheng * @date: 2017年9月19日 下午2:54:08 * 判断是否为回文数 * true ...
- mongodb为集合新增字段、删除字段、修改字段(转)
新增字段 为atest集合新增一个字段content db.atest.update({},{$set:{content:""}},{multi:1}) 删除uname字段 db. ...
- redis主从配置及其java的调用(转)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/gsying1474/article/de ...
- flex布局 justify-content:space-between; 解决最后一排数量不够自动向两端排列问题和flex布局的元素会有默认间隙(垂直间隙)
1 .flex 布局两端对齐当最后一排数量不够时,会出现以下布局情况 实现效果: 解决方案:使用after伪类, 解决最后一排数量不够两端分布的情况.宽度就是每张图片的宽度 .list:after { ...