lucene索引日期和数字

1.用途。spa

    索引数字的场景主要有两种:一是把它们看成字符串同样处理,好比“要是搁之前,术士能暴击10000多,有木有!”中的"10000",它和其它的词没什么区别,你能够把它仅仅想成一个字符串;另外一种场景则是某个域只索引数字,且能够搜索数字的范围等,好比设计了某个Field存储邮件的大小,如今要搜索大小在3M-10M的邮件。设计

    对于第一种状况,你要作的仅仅是选一个不会对数字进行分词的分析器。这种分析器不少,好比以前咱们用过的WhitespaceAnalyzer和StandardAnalyzer。固然WhitespaceAnalyzer分析器可能仅仅对英语之类的语言还有点用处。对于第二种状况,你不须要为这些专门设计用来存储数字的域进行分词,指定成Field.Index.NOT_ANALYZED就能够了。不过你必须清楚的是,Lucene内部处理的仍然只是String类型!即"10"是排在"2"前面的!如果想支持范围搜索,你须要为数字增长前置0, 即须要索引"02",这样"02"便排在"10"前面了!code

doc.add(new NumericField("attachs",Field.Store.YES,true).setIntValue(attachs[i]));   
doc.add(new NumericField("date",Field.Store.YES,true).setLongValue(dates[i].getTime()));  

 

2.  索引数字的场景主要有两种:一是把它们看成字符串同样处理,好比“要是搁之前,术士能暴击10000多,有木有!”中的"10000",它和其它的词没什么区别,你能够把它仅仅想成一个字符串;另外一种场景则是某个域只索引数字,且能够搜索数字的范围等,好比设计了某个Field存储邮件的大小,如今要搜索大小在3M-10M的邮件。blog

    对于第一种状况,你要作的仅仅是选一个不会对数字进行分词的分析器。这种分析器不少,好比以前咱们用过的WhitespaceAnalyzer和StandardAnalyzer。固然WhitespaceAnalyzer分析器可能仅仅对英语之类的语言还有点用处。对于第二种状况,你不须要为这些专门设计用来存储数字的域进行分词,指定成Field.Index.NOT_ANALYZED就能够了。不过你必须清楚的是,Lucene内部处理的仍然只是String类型!即"10"是排在"2"前面的!如果想支持范围搜索,你须要为数字增长前置0, 即须要索引"02",这样"02"便排在"10"前面了!排序

 

 

3。日期类型的使用场景可谓多之又多:邮件的寄出、收到日期;文件的建立日期、最后修改日期;HTTP响应中的最后修改日期等等。总之,绝大多数状况下,你会有处理日期的遭遇!Don't worry! Lucene为咱们装备了一个处理日期的利器:DateTools. 经过它,咱们能够便捷的把Date型转换成String型索引

//转自:BuN_Ny
//http://bun-ny.iteye.com/blog/1075632

Document doc = new Document(); doc.add(new Field("indexDate", DateTools.dateToString(new Date(), DateTools.Resolution.DAY), Field.Store.YES, Field.Index.NOT_ANALYZED));

 DateTools 能够把日期和时间转换成 YYYYMMDDhhmmss 的格式,并根据指定的resolution去除相应后缀。好比你指定了Resolution.DAY,2012年12月21日就会被转换成20121221,时分秒部分会被去除掉。这么一来,就很容易发现,即使是按字符串进行排序、比较,也能获得和日期相同的效果。字符串"20121221"是大于"20121121"的,而其对应的日期也是如此。采用这种方式处理日期是否是很简单?参数resolution容许你截取对你的应用有意义的日期部分,精确度从Resolution.MILLISECOND(毫秒)到Resolution.YEAR(年),可是值得注意的是,更高的精度就须要付出更大的代价!字符串

    提醒你一下,若是你的应用中须要搜索一个YYYYMMDD范围内的数据,而在展现的时候又但愿把时间部分(hhhmmss)也带上,你能够尝试建立两个域,一个索引到Resolution.DAY范围,另外一个仅仅设置Store.get

相关文章
相关标签/搜索