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):是指无法在一定时间 ...
随机推荐
- Linux CentOS 7 防火墙与端口设置操作
CentOS升级到7之后用firewall代替了iptables来设置Linux端口, 下面是具体的设置方法: []:选填 <>:必填 [<zone>]:作用域(block.d ...
- python基础编程: 编码补充、文件操作、集合、函数参数、函数递归、二分查找、匿名函数与高阶函数
目录: 编码的补充 文件操作 集合 函数的参数 函数的递归 匿名函数与高阶函数 二分查找示例 一.编码的补充: 在python程序中,首行一般为:#-*- coding:utf-8 -*-,就是告诉p ...
- 卸载CUDA和cuDNN
卸载CUDA和cuDNN 1.卸载CUDA 本教程只针对对于.run方式安装的,其他的没有进行测试 打开终端,输入sudo /usr/local/cuda-10.0/bin/uninstall_cud ...
- sql 178. 分数排名
编写一个 SQL 查询来实现分数排名.如果两个分数相同,则两个分数排名(Rank)相同.请注意,平分后的下一个名次应该是下一个连续的整数值.换句话说,名次之间不应该有“间隔”. +----+----- ...
- MyBatis笔记-03-CRUD
3.CRUD 1.namespace namespace中的包名要和Dao/mapper接口的包名保持一致 2.select 选择查询语句: id:就是对应的namespace中的方法名: resul ...
- k8s安装flannel报错“node "master" pod cidr not assigned”
一.在安装flannel网络插件后,发现pod: kube-flannel-ds 一直是CrashLoopBackOff 此报错是因为安装Kubeadm Init的时候,没有增加 --pod-netw ...
- 第十一章 前端开发-bootstrap
11.5.0 bootstrap 11.5.1 bootstrap的介绍和响应式 http://book.luffycity.com/python-book/95-bootstrap/951-boot ...
- Oracle之:Function :strFormatDate()
create or replace function strFormatDate(i_datestr in varchar2) return date is begin if i_datestr is ...
- WIF配置说明
<configuration> <configSections> <!--添加 WIF 4.5 sections :如下两条--> <section name ...
- HDU 6047 - Maximum Sequence | 2017 Multi-University Training Contest 2
/* HDU 6047 - Maximum Sequence [ 单调队列 ] 题意: 起初给出n个元素的数列 A[N], B[N] 对于 A[]的第N+K个元素,从B[N]中找出一个元素B[i],在 ...