详解SpringBoot + Lucene案例介绍

  

  
      <李>模拟一个商品的站内搜索系统(类似淘宝的站内搜索);李   <李>商品详情保存在mysql数据库的产品表中,使用mybatis框架;李   <李>站内查询使用Lucene创建索引,进行全文检索;李   <李>增,删,改,商品需要对Lucene索引修改,搜索也要达到近实时的效果。   
  

对于数据库的操作和配置就不在本文中体现,主要讲解与Lucene的整合。

  

  

向pom文件中引入依赖

        & lt; !——核心包——比;   & lt; dependency>   & lt; groupId> org.apache.lucene   & lt; artifactId> lucene-core   & lt; version> 7.6.0   & lt;/dependency>   & lt; !——对分词索引查询解析——比;   & lt; dependency>   & lt; groupId> org.apache.lucene   & lt; artifactId> lucene-queryparser   & lt; version> 7.6.0   & lt;/dependency>   & lt; !——一般分词器,适用于英文分词——比;   & lt; dependency>   & lt; groupId> org.apache.lucene   & lt; artifactId> lucene-analyzers-common   & lt; version> 7.6.0   & lt;/dependency>   & lt; !——检索关键字高亮显示——比;   & lt; dependency>   & lt; groupId> org.apache.lucene   & lt; artifactId> lucene-highlighter   & lt; version> 7.6.0   & lt;/dependency>   & lt; !——smartcn中文分词器——比;   & lt; dependency>   & lt; groupId> org.apache.lucene   & lt; artifactId> lucene-analyzers-smartcn   & lt; version> 7.6.0   & lt;/dependency>   之前      

  

初始化bean类需要知道的几点:

  

1。实例化IndexWriter, IndexSearcher都需要去加载索引文件夹,实例化是是非常消耗资源的,所以我们希望只实例化一次交给弹簧管理。

  

2。IndexSearcher我们一般通过SearcherManager管理,因为IndexSearcher如果初始化的时候加载了索引文件夹,那么

  

后面添加,删除,修改的索引都不能通过IndexSearcher查出来,因为它没有与索引库实时同步,只是第一次有加载。

  

3. controlledrealtimereopenthread创建一个守护线程,如果没有主线程这个也会消失,这个线程作用就是定期更新让SearchManager管理的搜索能获得最新的索引库、下面是每25 s执行一次。

  

4。要注意引入的lucene版本,不同的版本用法也不同,许多api都有改变。

        @ configuration   公开课LuceneConfig {/* *   * lucene索引,存放位置   */私有静态最终字符串LUCENEINDEXPATH=發ucene indexDir/?/* *   *创建一个分析器实例   *   * @return   */@ bean   公共分析仪分析器(){   返回新SmartChineseAnalyzer ();   }/* *   *索引位置   *   * @return   * @throws IOException   */@ bean   公共目录目录()抛出IOException {      路径路径=Paths.get (LUCENEINDEXPATH);   文件文件=path.toFile ();   如果(! file.exists ()) {//如果文件夹不存在,则创建   file.mkdirs ();   }   返回FSDirectory.open(路径);   }/* *   *创建indexWriter   *   * @param目录   * @param分析仪   * @return   * @throws IOException   */@ bean   公共IndexWriter IndexWriter(目录目录,分析仪分析器)抛出IOException {   IndexWriterConfig IndexWriterConfig=new IndexWriterConfig(分析);   IndexWriter IndexWriter=new IndexWriter(目录,indexWriterConfig);//清空索引   indexWriter.deleteAll ();   indexWriter.commit ();   返回indexWriter;   }/* *   * SearcherManager管理   *   * @param目录   * @return   * @throws IOException   */@ bean   公共SearcherManager SearcherManager(目录目录,IndexWriter IndexWriter)抛出IOException {   SearcherManager SearcherManager=new SearcherManager (indexWriter,假的,假的,新的SearcherFactory ());   ControlledRealTimeReopenThread cRTReopenThead=new ControlledRealTimeReopenThread (searcherManager indexWriter,   5.0、0.025);   cRTReopenThead.setDaemon(真正的);//线程名称   cRTReopenThead.setName(“更新IndexReader线程”);//开启线程   cRTReopenThead.start ();   返回searcherManager;   }   }      之前      

  

创建商品Bean

     /* *   *商品bean类   * @author yizl   *   */公共类产品{/* *   *商品标识   */私人int id;/* *   *商品名称   */私人字符串名称;/* *   *商品类型   */私人字符串类别;/* *   *商品价格   */私人浮动价格;/* *   *商品产地   */私人字符串的地方;/* *   *商品条形码   */私人字符串代码;   ……   

详解SpringBoot + Lucene案例介绍