Lucene 搜索性能优化
搜索优化:
1、设置boost
有些时候在搜索时某个字段的权重需要大一些,例如你可能认为标题中出现关键词的文章比正文中出现关键词的文章更有价值,你可以把标题的boost设置的更大,那么搜索结果会优先显示标题中出现关键词的文章(没有使用排序的前题下)。使用方法:
Field. setBoost(float boost);默认值是1.0,也就是说要增加权重的需要设置得比1大。
2、将不需要使用范围查询的数字字段设置precisionstep为Intger.max,这样数字写入倒排仅存一个term,能极大降低term数量。
复制代码
1 public final class CustomFieldType {
2 public static final FieldType INT_TYPE_NOT_STORED_NO_TIRE = new FieldType();
3 static {
4 INT_TYPE_NOT_STORED_NO_TIRE.setIndexed(true);
5 INT_TYPE_NOT_STORED_NO_TIRE.setTokenized(true);
6 INT_TYPE_NOT_STORED_NO_TIRE.setOmitNorms(true);
7 INT_TYPE_NOT_STORED_NO_TIRE.setIndexOptions(FieldInfo.IndexOptions.DOCS_ONLY);
8 INT_TYPE_NOT_STORED_NO_TIRE.setNumericType(FieldType.NumericType.INT);
9 INT_TYPE_NOT_STORED_NO_TIRE.setNumericPrecisionStep(Integer.MAX_VALUE);
10 INT_TYPE_NOT_STORED_NO_TIRE.freeze();
11 }
12 }
复制代码
1
doc.add(new IntField("price", price, CustomFieldType.INT_TYPE_NOT_STORED_NO_TIRE));//人均消费
3、优化方法是只存储id等必须的字段,对于大部分字段我们只索引而不存储,通过这种方法,索引压缩文件降低了10%左右。
1 doc.add(new StringField("price", each, Field.Store.NO));
4、索引更新:indexWriter.updateDocument(new Term("id", "1"), doc);
5、lucene 3.5后删除了optimize(),将IndexWriter.optimize重命名为forceMerge,以便去阻止使用这种方法,因为它的使用代价较高,且也不需要使用
6、新版本的Lucene通常性能都会有些改善
7、使用更快的硬件,例如,改善IO系统性能
8、在建立索引过程中,使用单例的 Writer(注:应该是有有助于避免锁)
9、使用内存索引:
// 打开索引目录
File indexDir = new File(idxDir);
Directory directory = FSDirectory.open(indexDir);
Directory ramDir = new RAMDirectory(directory);
// 获取访问索引的接口,进行搜索
IndexReader indexReader = IndexReader.open(ramDir);
10、// TopDocs 提前返回搜索结果
TopDocs topDocs = indexSearcher.search(query, 100);// 只返回前100条记录
11、不需要highlight则可以将term vector关掉
12、业务能不能拆分, 比如之前音乐图书视频资讯和app一起做搜索, 可以考虑将他们分开
13、调整内存Xms和Xmx,采用多线程gc
14、在频繁更新索引的情况下,使用两个索引,一个大的优化好的历史索引,一个小的实时添加的索引
15、使用FieldSelector仔细的选择哪些字段需要获取,如何获取