当前位置: 移动技术网 > IT编程>开发语言>.net > Lucene.net常用功能说明

Lucene.net常用功能说明

2017年12月21日  | 移动技术网IT编程  | 我要评论

许魏洲抵韩开唱,胖毛在线,高报网

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的性能,可以参考:

 

 

4)      检索不准:一般情况下检索不准都与分词有关。不同的分词效果会导致检索与预期的不一致。 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网