日常开发中,相信大家经常会用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. 1.搜索引擎的历史,搜索引擎起步,发展,繁荣,搜索引擎的原理,搜索技术用途,信息检索过程,倒排索引,什么是Lucene,Lucene快速入门

     一: 1  搜索引擎的历史 萌芽:Archie.Gopher Archie:搜索FTP服务器上的文件 Gopher:索引网页 2  起步:Robot(网络机器人)的出现与spider(网络爬虫) ...

  2. Lucene快速入门

    1. 什么是lucene lucene是Apache的一个全文检索工具,使用lucene能快速实现全文检索功能.Lucene是一个工具包,你可以调用它的函数, 但它不能独立运行,不单独对外提供服务. ...

  3. Solr快速入门

    1. 什么是Solr Solr是基于lucene的全文检索服务器.不同于lucene工具包,solr是一个web应用,运行在servlet容器,屏蔽了底层细节,并对外提供服务. 点我lucene快速入 ...

  4. Lucene第一篇【介绍Lucene、快速入门】

    什么是Lucene?? Lucene是apache软件基金会发布的一个开放源代码的全文检索引擎工具包,由资深全文检索专家Doug Cutting所撰写,它是一个全文检索引擎的架构,提供了完整的创建索引 ...

  5. 【转载】Lucene.Net入门教程及示例

    本人看到这篇非常不错的Lucene.Net入门基础教程,就转载分享一下给大家来学习,希望大家在工作实践中可以用到. 一.简单的例子 //索引Private void Index(){    Index ...

  6. 【solr专题之一】Solr快速入门

    一.Solr学习相关资料 1.官方材料 (1)快速入门:http://lucene.apache.org/solr/4_9_0/tutorial.html,以自带的example项目快速介绍发Solr ...

  7. Elasticsearch【快速入门】

    前言:毕设项目还要求加了这个做大数据搜索,正好自己也比较感兴趣,就一起来学习学习吧! Elasticsearch 简介 Elasticsearch 是一个分布式.RESTful 风格的搜索和数据分析引 ...

  8. Elastic 技术栈之快速入门

    Elastic 技术栈之快速入门 概念 ELK 是什么 ELK 是 elastic 公司旗下三款产品 ElasticSearch .Logstash .Kibana 的首字母组合. ElasticSe ...

  9. Hadoop生态圈-大数据生态体系快速入门篇

    Hadoop生态圈-大数据生态体系快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.大数据概念 1>.什么是大数据 大数据(big data):是指无法在一定时间 ...

随机推荐

  1. 轻松阅读linux内核源码

    神器:基于linux4.4版本,含函数和功能注释树 http://www.bricktou.com/ https://lwn.net/ 从0开始写linux,这个无敌牛逼,简单阅读了Introduct ...

  2. Delphi用QJSON解析JSON格式的数据 【转】

    本来用superobject来解析JSON已经够用了,可惜这个东东不能在移动端使用,于是找到QJSON来处理. 这是一个国内高手写开源免费的东西,赞一个. 假入数据如下: {"message ...

  3. 完全平方数 HYSBZ - 2440 (莫比乌斯函数容斥)

    完全平方数 HYSBZ - 2440 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些 数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而 这丝毫不影响他对其他 ...

  4. P2634 树上路径长度为3的倍数的点对数 点分治

    在计算答案的时候维护一个数组num num[i]为当前所有点距离根距离%3的数量 则当前块的答案为num[0]*num[0]+2*num[1]*num[2] #include<bits/stdc ...

  5. python+Appium自动化:输入中文问题

    只要接触到app自动化,难免会遇到许多坑,今天说说解决中文输入的问题. 流程: 进入到淘宝应用,点击搜索栏,输入文字 一开始send_keys(“中文”)时,搜索栏一直没有出现文字,脚本也没有提示报错 ...

  6. 【u-boot】u-boot中initf_dm()函数执行流程(转)

    前部分设备模型初始化 为了便于阅读,删掉部分代码,只留关键的过程: static int initf_dm(void){    int ret;    ret = dm_init_and_scan(t ...

  7. Linux下DB2指令总结

    1.显示当前实例 >> get instance The current database manager instance is: db2axing 2.列出当前实例中激活的数据库 &g ...

  8. MQTT 入门介绍——菜鸟教程

    一.简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级& ...

  9. BZOJ 1984: 月下“毛景树” (树链剖分+线段树)

    注意赋值和加法的标记下传优先级.具体看代码. CODE #include <vector> #include <queue> #include <cstdio> # ...

  10. Acwing-204-表达整数的奇怪方式(扩展中国剩余定理)

    链接: https://www.acwing.com/problem/content/206/ 题意: 给定2n个整数a1,a2,-,an和m1,m2,-,mn,求一个最小的非负整数x,满足∀i∈[1 ...