SpringDataSolr

SpringDataSolr

SpringDataSolr和solr的关系可以参考下面:

Mysql jdbc    mybatis

Redis  jedis   springDataRedis

Solr   solrJ    SpringDataSolr

一、Lucene和solr

1、什么是全文检索

先建立索引文件,在索引文件中搜索的过程就是全文检索

2、如何实现全文检索   可以使用Lucene

3、Lucene和solr的关系

Lucene是一套类库jar ,solr是基于Lucene的一个项目,war包
二、solr的安装示例(安装包自己网上找…):

  1、准备一个干净的tomcat,修改tomcat的端口号 8888

  2、从Solr\solr-4.10.3\dist文件夹中拷贝solr-4.10.3.war到tomcat的webapps文件夹下并且改名solr.war

  3、启动tomcat完成解压,解压完后关闭tomcat, war删除

  4、配置solrhome(索引文件放的位置)

      拷贝Solr\solr-4.10.3\example下的solr文件夹,放到一个没有中文没有空格的位置改名为solrhome

      配置solr项目和solrhome的关系:修改solr项目的web.xml的第43行

  5、拷贝Solr\solr-4.10.3\example\lib\ext下的所有jar放到solr项目中

  6、启动tomcat 使用http://localhost:8888/solr

solrcore的配置(可配可不配)

 solrcore相当于mysql中的database

  1、进入solrhome中拷贝collection1 改名为collection2

  2、进入collection2中修改core.properties文件中的内容

  3、重启tomcat

Solr中域名名字是先定义后使用

三、 配置自己的业务域 使用IKAnalyzer分词器

 1、配置中文分词器

1)拷贝jar和配置文件
 从Solr\IK Analyzer 2012FF_hf1文件夹下拷贝jar放到solr项目中
 从Solr\IK Analyzer 2012FF_hf1文件夹下拷贝配置文件到solr\WEB-INF\classes中(classes需要自己手动创建)
 IKAnalyzer.cfg.xml 、 ext_stopword.dic 、mydict.dic

 2、添加业务域  修改的是solrcore下的schema.xml

schema.xml内容说明

field域名 举例    <field name="_version_" type="long" indexed="true" stored="true"/>
 name:域的名字
 type:域的类型
 indexed:是否索引  以后此字段是否用来检索
 stored:是都存储   原内容是否存储

dynamicField:动态域  举例: <dynamicField name="*_i"  type="int"    indexed="true"  stored="true"/>
 name:域的名字
 type:域的类型
 indexed:是否索引  以后此字段是否用来检索
 stored:是都存储   原内容是否存储

uniqueKey:唯一域   <uniqueKey>id</uniqueKey>

复制域copyField:举例 <copyField source="cat" dest="text"/>
source:源
dest :目标
域类型:举例:
   <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
      <analyzer>
 <tokenizer class="solr.WhitespaceTokenizerFactory"/>
      </analyzer>
    </fieldType>

在schema.xml中添加以下信息(示例):

<fieldType name="text_ik" class="solr.TextField">

  <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>

</fieldType>

<field name="item_goodsid" type="long" indexed="true" stored="true"/>

<field name="item_title" type="text_ik" indexed="true" stored="true"/>

<field name="item_price" type="double" indexed="true" stored="true"/>

<field name="item_image" type="string" indexed="false" stored="true" />

<field name="item_category" type="string" indexed="true" stored="true" />

<field name="item_seller" type="text_ik" indexed="true" stored="true" />

<field name="item_brand" type="string" 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_category" dest="item_keywords"/>

<copyField source="item_seller" dest="item_keywords"/>

<copyField source="item_brand" dest="item_keywords"/>

<dynamicField name="item_spec_*" type="string" indexed="true" stored="true" />

添加完毕后重启tomcat


SpringDataSolr操作solr

<dependency>
   <groupId>org.springframework.data</groupId>
   <artifactId>spring-data-solr</artifactId>
   <version>1.5.5.RELEASE</version>
</dependency>
<!--applicationContext-solr.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:solr="http://www.springframework.org/schema/data/solr"
      xsi:schemaLocation="http://www.springframework.org/schema/data/solr
     http://www.springframework.org/schema/data/solr/spring-solr-1.0.xsd
     http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context.xsd">
   <!-- solr服务器地址 -->
   <solr:solr-server id="solrServer" url="http://127.0.0.1:8888/solr"/>
   <!-- solr模板,使用solr模板可对索引库进行CRUD的操作 -->
   <bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
       <constructor-arg ref="solrServer"/>
   </bean>
</beans>
// 配置属性和solr域名的对应关系
public class TbItem implements Serializable {
   @Field("id")
   private Long id;
   @Field("item_title")
   private String title;
   private String sellPoint;
   @Field("item_price")
   private BigDecimal price;
 
   @Field("item_spec_*") // 动态域
   @Dynamic
   private Map<String, String> map;
 ......
}
// Test.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring/applicationContext-solr.xml")
public class Test {
   @Autowired
   private SolrTemplate solrTemplate;

   @org.junit.Test
   public void testAdd() {
       TbItem item = new TbItem();
       item.setId(1L);
       item.setTitle("小米真香");
       solrTemplate.saveBean(item);
       solrTemplate.commit(); // todo 不要忘记提交
   }

   @org.junit.Test
   public void testupdate() {
       TbItem item = new TbItem();
       item.setId(1L);
       item.setTitle("小米真的香");
       solrTemplate.saveBean(item);
       solrTemplate.commit(); // todo 不要忘记提交
   }

   @org.junit.Test
   public void testdelete() {
       TbItem item = new TbItem();
       solrTemplate.deleteById("1"); // 根据ID删除
       // SolrDataQuery solrDataQuery = new  SimpleQuery("item_title:测试");
       SolrDataQuery solrDataQuery = new SimpleQuery("*:*");
       solrTemplate.delete(solrDataQuery); // 按条件删除
       solrTemplate.commit(); // todo 不要忘记提交
   }

   @org.junit.Test
   public void query() {
       TbItem item = new TbItem();
       Query query = new SimpleQuery("item_title:小米");
       ScoredPage<TbItem> tbItems = solrTemplate.queryForPage(query, TbItem.class);
       List<TbItem> content = tbItems.getContent();
       for (TbItem tbItem : content) {
           System.out.println(tbItem.getTitle());
       }
   }
}
从数据库查询数据并存入索引库
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:spring/applicationContext*.xml")
public class SolrMapper {
   // 从mysql中查询,放入到solr中
   //  select i.* from tb_goods g,tb_item i where i.goods_id=g.id and g.is_marketable='1'

   @Autowired
   private SolrTemplate solrTemplate;

   @Autowired
   private TbItemMapper itemMapper;

   @Test
   public void init() {
       List<TbItem> list = itemMapper.isSelled();
       for (TbItem item : list) {
           String spec = item.getSpec(); // {"网络":"移动4G","机身内存":"64G"}
           Map<String, String> map = JSON.parseObject(spec, Map.class);
           item.setMap(map);
       }
       solrTemplate.saveBeans(list);
       solrTemplate.commit();
   }

   @Test
   public void test() {
       String str = "{'网络':'移动4G','机身内存':'64G'}";
       Map<String, String> map = JSON.parseObject(str, Map.class);
       Set<String> set = map.keySet();
       for (String s : set) {
           System.out.println(s + ":" + map.get(s)); // 网络:移动4G 机身内存:64G
       }
   }
}
// 查询索引库数据示例
@Service
public class SearchServiceImpl implements SearchService {
   @Autowired
   private SolrTemplate solrTemplate;
   @Override
   public Map searchByParam(Map map) {
       // 从solr索引库查
       TbItem tbItem = new TbItem();
       Query query = new SimpleQuery("item_title:" + map.get("keyword")); // keyword是从页面传来的
       ScoredPage<TbItem> scoredPage = solrTemplate.queryForPage(query, TbItem.class);
       List<TbItem> itemList = scoredPage.getContent(); // 当前页数据
       long total = scoredPage.getTotalElements();// 总条数
       Map itemMap = new HashMap();
       itemMap.put("itemList", itemList);
       itemMap.put("total", total);
       return itemMap;
   }
}


发表评论