-
<李>模拟一个商品的站内搜索系统(类似淘宝的站内搜索);李>
<李>商品详情保存在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案例介绍