Mac环境下的solr+中文分词器配置
-
启动solr
solr start
服务启动后会提示
Started Solr server on port 8983 (pid=1032). Happy searching!
打开http://localhost:8983/即可访问solr控制台
-
创建新的core
solr create -c collection
创建完成后,可在这里选择到刚刚创建的core(core相当于数据库中的实例)
并且在solr的安装目录下可以看到已经自动帮你创建好了对应的文件夹(这个文件夹中有我们配置solr的配置文件,后面需要修改)
-
配置field和中文分词器
打开managed-schema,修改配置文件,配置完成后使用
solr restart
命令重启一下solr服务在之前添加对应的field,标签中的name对应springboot pojo类中的注解@Field后面的名字(下面有对应的pojo的代码)
<?xml version="1.0" encoding="UTF-8"?> <!-- Solr managed schema - automatically generated - DO NOT EDIT --> <schema name="default-config" version="1.6"> ..... <!-- 配置中文分词器 --> <fieldType name="text_ik" class="solr.TextField"> <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType> <!-- 下面的name对应springboot pojo类中的注解@Field --> <field name="item_title" type="text_ik" indexed="true" stored="true"/> <field name="item_sell_point" type="text_ik" indexed="true" stored="true"/> <field name="item_price" type="pdouble" indexed="true" stored="true"/> <field name="item_image" type="string" indexed="false" stored="true" /> <field name="item_category_name" type="string" indexed="true" stored="true" /> <field name="item_desc" type="text_ik" indexed="true" stored="true" /> <field name="item_goodsid" type="text_ik" indexed="true" stored="true" /> <field name="item_category" type="text_ik" indexed="true" stored="true" /> <field name="item_brand" type="text_ik" indexed="true" stored="true" /> <field name="item_seller" type="text_ik" indexed="true" stored="true" /> <field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/> <copyField source="item_title" dest="item_keywords"/> <copyField source="item_sell_point" dest="item_keywords"/> <copyField source="item_desc" dest="item_keywords"/> </schema>
其中item_keywords是我们要配置的业务字段,比如我们想同时对商品的标题(item_title),卖点(item_sell_point),描述(item_desc)进行搜索的时候,我们就可以将这几个字段统一设成item_keywords,这样子我们搜索的时候只需要对item_keywords进行赋值,solr就会帮我们对标题,卖点,描述进行搜索。
我对应的pojo类
package com.online.shopping.pojo; public class TbItem implements Serializable { @Field private Long id; @Field("item_title") // 表示 持久化对象 的属性和solr业务字段的映射关系 private String title; private String sellPoint; @Field("item_price") private Double price; private Integer stockCount; private Integer num; private String barcode; @Field("item_image") private String image; private Long categoryid; private String status; private Date createTime; private Date updateTime; private String itemSn; private Double costPirce; private Double marketPrice; private String isDefault; @Field("item_goodsid") private Long goodsId; private String sellerId; private String cartThumbnail; @Field("item_category") private String category; @Field("item_brand") private String brand; private String spec; @Field("item_seller") private String seller; @Dynamic @Field("item_spec_*") private Map<String,String> specMap; .....// 一些getter和setter }
-
同步数据库数据
先在application.yml中配置solr服务
server: port: 8817 eureka: client: service-url: defaultZone: http://localhost:8761/eureka spring: data: solr: host: http://127.0.0.1:8983/solr
在对应微服务下,使用springboot的test类,导入数据库中某个表的数据(目前如果数据库中的数据更新,需要手动同步,先执行
testRemove
清空solr,再执行testImportMany
导入)@SpringBootTest public class SolrTest { @Autowired private TbItemMapper itemMapper; @Autowired private SolrTemplate solrTemplate; @Test public void testImportMany() { List<TbItem> list = itemMapper.selectByExample(null); solrTemplate.saveBeans("collection", list); //批量保存 solrTemplate.commit("collection");; System.out.println("操作完成"); } @Test public void testRemove() { Query query = new SimpleQuery("*:*"); //全部清空solr solrTemplate.delete("collection", query); solrTemplate.commit("collection");; System.out.println("操作完成"); } }
-
重启solr
solr restart
-
测试
修改q值测试
成功!