小记一些Lucene系搜索引擎的实用技巧

  1. 排序是在获取文档docidset之后的操作,这时会通过id获取排序字段的docvalues。对于需要排序,分组的字段,尽量使用启用docvalues来加速排序,而且docvalues是建立在磁盘上的,使用的是文件系统的缓存,并不会占用jvm的内存,能合理利用计算机的资源。
  2. 请尽量使用数值类型的字段进行排序。
  3. 对于store和docvalues,虽然两者都能存储字段的值,但是我这里强烈建议,尽量不要对只需要存储的字段用docvalues来进行存储。因为docvalues中设计了几种不同的数据结构,对于字符串类型的docvalues,在lucene的底层的使用中,会有一个originalmap来做值和文档的映射,如果docvalues中的值特别多,尤其是绝大多数都不重复的情况下,重建这个map的性能消耗特别大。而且docvalues是面向列的,store本质还是行的。所以结合上述,从使用的角度去考虑,在存储需求的情况下请尽量使用store。
  4. 如果有些功能需要用到级联的查询,可以自己写一个相应规则的分词器,以满足不同规则的搜索需求。比如有时候需要省市区县的级联查询,这样呢,我们可以定义好一种数据结构来进行标记,可以用前两位表示省级地区,比如01代表北京,02代表河北,0201代表河北石家庄市,020101代表石家庄市新华区,这样的话我们就能能按照这样的规则进行分词,将020101拆成三个部分02,0201,020101这样在索引中就会索引三个term,每个级别的term都能查询出相应的结果,也不需要在搜索的时候进行更多的操作。
  5. 不要把Lucene及其衍生引擎作为一个实时的存储数据库使用。
  6. 索引文件是不可变的,只能合并。
  7. 删除文档时只是标记为删除,只有合并段的时候才会真正的删除。所以更新频繁的情况下,可能占用更多的磁盘空间。

你可能感兴趣的:(小记一些Lucene系搜索引擎的实用技巧)