1.对于不同域使用不同的分词器
//创建不同field对应的分词器
Map<String,Analyzer> analyzerPerField = new HashMap<String,Analyzer>();
analyzerPerField.put("filename", new KeywordAnalyzer());
analyzerPerField.put("path", new SimpleAnalyzer(Version.LUCENE_46));
//默认使用StandardAnalyzer分词器
PerFieldAnalyzerWrapper aWrapper =
new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_46), analyzerPerField);
2.QueryParser检索未分词的Field时注意事项:
由于QueryParser进行索引时,会根据创建对象时用到的分词器对检索内容进行分词,所以对于那些在索引时没有进行分词的field会产生不可预估的问题(根据不同的分词器产生不同的效果),对于这样的问题,可以使用PerFieldAnalyzerWrapper 针对未进行索引的Field进行处理。(KeywordAnalyzer用来处理数字部分,将数字作为一个整体)
3.对于检索进行排序
lucene默认对检索结果排序是根据检索的相关性进行排序,这主要是根据lucene的评分规则来进行排序,并将评分较高的显示在前边,但是对于一些需求来说,需要使用特殊的字段进行排序,lucene可以在searcher.search()中传入Sort对象,进行不同的排序操作,Sort默认有两个排序,Sort.RELEVANCE与Sort.INDEXORDER,前一个主要是lucene默认的排序操作,即相关度降序排序,(由于使用Sort对象会产生额外开销,所以在使用相关度排序,即默认排序时,尽量不要传入该参数)。Sort.INDEXORDER主要用于根据索引顺序排序,是根据文档的ID栏进行升序排列。Sort对象还可以根据不同的Field进行排序,如:
new Sort(new SortField("size", Type.LONG,true))//size:要进行排序的字段名,Type.LONG:字段保存值类型,boolean类型的参数,true表示倒序
对于传入sort对象的检索,可以使用如下方式进行检索
TopDocs tps = this.getSearcher().search(query, null, 100, sort);
默认情况下,接受Sort对象的search方法不会对匹配文档进行任何评分操作,因为评分会消耗大量系统性能,并且很多程序在通过域排序时不需要进行评分操作。如果需要影响评分时,可以使用
//doDocScores=true:每个被搜索到的结果都进行结果操作,doMaxScore=true,对最大分值的命中结果进行评分操作-开销比较大
TopDocs tps = this.getSearcher().search(query, null, 100, sort, true, false);