Lucene.net常用功能说明
Lucene.net是一个.net下的全文检索类库。配置简单,功能丰富,比较成熟。我在项目中用Lucene.net有一段时间了,这里我把常用一些功能写出来,与大家一起分享。
Lucene.net用的是3.0版本,分词采用盘古分词。示例程序用VS2010进行编译。
1 索引
在做索引时,有些参数是需要配置的,下面介绍下常用的参数配置。
1) 数据类型,如整形、时间、字符。
每种类型生成的索引方式都是不同的。比如:字符串需要分词,整形数据则不需要。生成索引的方式会影响到检索,如果整形按照字符串的方式生成索引,则比较不容易实现区域检索:如,ID>1000 and ID<2000。
时间索引比较特殊一些。Lucene.net无法对时间字段进行排序和区域检索,所以,要把时间字段转成长整形来实现。时间索引参考如下代码:
var time = DateTime.Now;
var timeField = new NumericField("Publish", Field.Store.YES, true).SetLongValue(time.Ticks);
2) 是否存储元数据。
如果进行存储,Lucene则会把索引数据与元数据同时进行存储。
好处:取数据比较容易。
坏处:索引比较大,可能会影响检索的速度
3) 是否进行排序
Lucene.net是支持排序的,包括整形排序、时间排序、字符串排序。
但排序和索引有什么关系呢?
我们知道Lucene.net做索引时,需要把字符串数据进行分词,便于实现全文检索。这时,如果一段文字已经分过词,如:“我的未来不是梦”,分词后应该是:我-的-未来-不是-梦,这样,一段文字分成若干个词进行索引,索引时,词的顺序也发生了变化。其中有一些词或符号在索引时会被滤掉,所以就无法进行排序了。如果要排序,则不应该进行分词。做索引时参考如下代码:
var filed = new Field("title_sort", "我的未来不是梦", Field.Store.NO, Field.Index.NOT_ANALYZED);
如果一个字段,既要实现模糊检索,又要实现精确匹配或排序,则应该把这个字段做两份索引,一份分词,一份不分词。
2 检索
1) 字符串检索
字符检索时,一般要对关键词进行分词。
var keywords = ParserKeyWord(keyword);
QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, item.Column, analyzer);
query = parser.Parse(keywords);
2) 时间、整形检索
时间和整形都是通过NumericRangeQuery来实现。
NumericRangeQuery<long> query = NumericRangeQuery.NewLongRange("ID", 0, 10000000, true, true);
3) 全词匹配
如果要实现全词匹配,在做索引时,该字段就不能进行分词。
Term t = new Term(item.Column, item.Value.ToString());
query = new TermQuery(t);
4) 多条件检索
多条件进行检索可以通过BooleanQuery进行实现,参考如下代码:
bq.Add(query, Occur.MUST);
bq.Add(query1, Occur.MUST);
这里query可以是任意检索条件,BooleanQuery只是把条件进行拼接。在多条件的情况下,我们经常会遇到这样的检索条件:title =’a’ and (author=’x’ or author =’y’)
遇到这样的条件时,我们可以使用BooleanQuery进行嵌套。这里我们可以用两个BooleanQuery实现。
BooleanQuery1用来连接author=’x’和 author =’y’,逻辑运算符为OR
BooleanQuery2用来连接title =’a’和BooleanQuery1,逻辑运算会为And。
5) 多索引检索
多索引检索是指同时对多个索引目录进行检索。通过MultiSearcher来实现。参考如下代码:
MultiSearcher multiSearch = new MultiSearcher(allIndexSearch.ToArray());
MultiSearcher初始化时,需要指定多个索引目录,其它操作与单个索引检索基本相同。
6) 多索引并行检索
多索引并行检索是指同时对多个索引进行并行检索。当单个索引超过10G大小时,我们可以考虑做多个索引,然后利用并行检索提高检索性能。并行检索通过ParallelMultiSearcher来实现,参考如下代码:
ParallelMultiSearcher parallelMultiSearch = new ParallelMultiSearcher(allIndexSearch.ToArray());
ParallelMultiSearcher在初始化时,需要指定多个索引目录,其它操作与单个索引检索基本相同。
3 排序
Lucene.net支持常见字段的排序。默认按照相关度进行排序。在实现排序之前,一定要做好索引。当对特定字段进行排序时,会严重影响检索的性能,尤其是按字符串进行排序。当数据量比较大时,一定要先做好压力测试,以便确认lucene.net是否满足性能要求。
排序是在检索时,通过SortField来实现的。参考如下代码:
searcher.Search(query, null, limitCount, new Sort(new SortField("Title", SortField.STRING, true)));
注意SortField.STRING这个参数。这里是字符串,所以用SortField.STRING,如果是整形字段,则参数应该是:SortField.INT。
4 常见问题
1) 时间字段:如果要实现时间字段的排序或区域检索,一定要把时间字段的值转成长整形。细节请参考《索引》。
2) 分页:Lucene.net在检索时有一个参数:(int n),这个参数是用来取前n条记录,一般情况下,这个参数n最好不要太大,否则会影响检索性能。百度即使检索到1亿条记录,但最多也就显示760条记录。我一般都是取1000条记录,然后在内存中进行分页。
3) 关于Lucene.net的性能,可以参考:
http://www.cnblogs.com/xingzhang/p/LuceneProject.html
4) 检索不准:一般情况下检索不准都与分词有关。不同的分词效果会导致检索与预期的不一致。
5 总结
用Lucene.net有一段时间了,总体感觉很稳定、性能也不错、功能实现灵活。但Lucene.net毕竟是一个全文索引项目,所以,要完全实现关系型数据库的功能,如:增、删、改、查、联合检索、分组等,并不容易,而且没有必要。不要用Lucene.net去代替关系型数据库,应该把Lucene.net作为关系型数据库的一个补充。
上面的例子只给出了关键代码或逻辑代码,下面提供完整的源代码。
Lucene.net常用功能说明的更多相关文章
- lucene全文搜索之一:lucene的主要功能和基本结构(基于lucene5.5.3)
前言:lucene并不是像solr或elastic那样提供现成的.直接部署可用的系统,而是一套jar包,提供了一些常见语言分词.构建索引和创建搜索器等等功能的API,我们常用到的也就是分词器.索引目录 ...
- WebStorm 常用功能的使用技巧分享
WebStorm 是 JetBrain 公司开发的一款 JavaScript IDE,使用非常方便,可以使编写代码过程更加流畅. 本文在这里分享一些常用功能的使用技巧,希望能帮助大家更好的使用这款强大 ...
- AVA正则表达式4种常用功能
正则表达式在字符串处理上有着强大的功能,sun在jdk1.4加入了对它的支持 下面简单的说下它的4种常用功能: 查询: String str="abc efg ABC"; Str ...
- [转]WebPack 常用功能介绍
概述 Webpack是一款用户打包前端模块的工具.主要是用来打包在浏览器端使用的javascript的.同时也能转换.捆绑.打包其他的静态资源,包括css.image.font file.templa ...
- FastReport.Net 常用功能总汇
一.常用控件 文本框:输入文字或表达式 表格:设置表格的行列数,输入数字或表达式 子报表:放置子报表后,系统会自动增加一个页面,你可以在此页面上设计需要的报表.系统在打印处理时,先按主报表打印,当碰到 ...
- python3 字符串与列表常用功能
一.字符串常用功能 1. capitalize(),将字符串的首字母变成大写,其余全部置为小写:如果字符串中有多个单词,也只是将第一个单词的首字母置为大写:例: >>> name = ...
- matlab进阶:常用功能的实现,常用函数的说明
常用功能的实现 获取当前脚本所在目录 current_script_dir = fileparts(mfilename('fullpath')); % 结尾不带'/' 常用函数的说明 bsxfun m ...
- WebPack常用功能介绍
概述 Webpack是一款用户打包前端模块的工具.主要是用来打包在浏览器端使用的javascript的.同时也能转换.捆绑.打包其他的静态资源,包括css.image.font file.templa ...
- JavaScript 常用功能总结
小编吐血整理加上翻译,太辛苦了~求赞! 本文主要总结了JavaScript 常用功能总结,如一些常用的JS 对象,基本数据结构,功能函数等,还有一些常用的设计模式. 目录: 众所周知,JavaScri ...
随机推荐
- mysql server install
1.首先在mysql的官网www.mysql.com或者其他网站下载mysql.zip或者mis格式的文件目前5.6的差不多300多M. 2.zip压缩包是绿色版的不用安装,直接用dos命令操作就行. ...
- F(x)
Problem Description For a decimal number x with n digits (AnAn-1An-2 ... A2A1), we define its weight ...
- [CODEVS1037]取数游戏
N(2 <=N<=200,且为偶数)个正整数的序列放在一个游戏平台上,A.B两人轮流从序列的两端取数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束.以最终得分多者为胜(A ...
- Hive 0.12 Caused by: MetaException(message:Version information not found in metastore. )解决方法
配置完成Mysql存储元数据信息,启动后测试show tables报错ERROR exec.DDLTask: org.apache.hadoop.hive.ql.metadata.HiveExcept ...
- 问题-[delphi2007、2010]无法二次启动,报EditorLineEnds.ttr被占用,进程一直有bds.exe?
问题现象:delphi2007.2010无法二次启动,报EditorLineEnds.ttr被占用,而且进程中一直有bds.exe的进程? 问题原因:问题处理:方法一:可能是系统更新的东东造在的.KB ...
- nyoj 1022 最少步数【优先队列+广搜】
最少步数 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 这有一个迷宫,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 ...
- linux 查看cpu 内存 硬盘 文件夹大小
文件夹大小 显示cpu使用率 top 1 查看CPU 1.1 查看CPU个数 # cat /proc/cpuinfo | grep "physical id" | uniq | w ...
- 五、SQL映射的XML文件
MyBatis真正的力量是在映射语句中.这里是奇迹发生的地方.对于所有的力量,SQL映射的XML文件是相当的简单.当然如果你将它们和对等功能的JDBC代码来比较,你会发现映射文件节省了大约95%的代码 ...
- 使用ProcDump在程序没有响应时自动收集dump
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:使用ProcDump在程序没有响应时自动收集dump.
- 从a站点跳转到b站点,通过url的参数判断是否让该用户选择身份
一.问题的由来 问题是这样子给出来,今天产品那边跟我说,在a网站跳转到b网站时,让用户有一个选择身份的弹窗.因为公司有两个不同站点,你无论在a或者b网站注册后,都可以随便登录这两个站点,进入之后都会有 ...