zoukankan      html  css  js  c++  java
  • Spring Data Solr

    1.什么是spring data solr?

    Solr是一个开源搜索平台,用于构建搜索应用程序。简单的来说就是作为一个搜索引擎使用。

    2.solr的安装(本地安装,远程安装同)

    1)解压一个tomcat,用于运行solr项目

    2)下载一个solr,然后解压

    3) solr 下的dist目录中solr的war文件部署到tomcat\webapps下,把war的名字改为solr

    4)启动tomcat,把war解压

    5)solrexample/lib/ext 目录下的所有的 jar 包复制到 solr 的工程WEB-INF/lib中

    6)创建一个 solrhome。把solr 下的/example/solr 目录D盘改名为solrhome 

    7)需要修改 solr 工程的 web.xml 

     <env-entry>
           <env-entry-name>solr/home</env-entry-name>
           <env-entry-value>d:\solrhome</env-entry-value>
           <env-entry-type>java.lang.String</env-entry-type>
     </env-entry>

    8)启动 Tomcat,在浏览器输入http://localhost:8080/solr,看到如下页面说明solr已安装成功

    9)选择仓库,进行查询

     

     3.中文分析器IK Analyzer

    IK Analyzer 是一个开源的,基于java 语言开发的轻量级的中文分词工具。

    IK Analyzer配置:

    1)IKAnalyzer2012FF_u1.jar 添加到 solr 工程的 lib 目录下

    2)创建WEB-INF/classes文件夹,把扩展词典mydict.dic、停用词词典ext_stopword.dic、配置文件IKAnalyzer.cfg.xml放到 solr 工程的WEB-INF/classes 目录下。

    3)修改 solrhome\collection1\conf\schema.xml 文件,在文件的尾部配置一个 FieldType。

    <fieldType name="text_ik" class="solr.TextField">
         <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
    </fieldType>

     4.域

    相当于数据库的表字段。

    域的常用属性:

    name:指定域的名称
    type:指定域的类型
    indexed:是否索引,当需要根据此字段查询时为true
    stored:是否存储,设置存储后才能查询此字段
    required:是否必须
    multiValued:是否多值

    1)字段域

    将实体类中要保存到solr索引库的属性进行映射配置,与索引库的字段进行一一对应

    <field name="item_id" type="int" indexed="true" stored="true"/>

    2)复制域

    复制域的作用在于将某一个Field中的数据复制到另一个域中,进行匹配查询

    <field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
    <copyField source="item_name" dest="item_keywords"/>

    3)动态域

    需要动态扩充字段时,要使用动态域

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

    5.spring data solr入门

    1)创建maven工程,名为springdata-solr,在pom.xml中引入依赖

     <dependencies>
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-solr</artifactId>
                <version>1.5.5.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.9</version>
            </dependency>
        </dependencies>

    2)src/main/resources下创建spring目录,目录下新建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:8080/solr" />
        <!-- solr模板,使用solr模板可对索引库进行CRUD的操作 -->
        <bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
            <constructor-arg ref="solrServer" />
        </bean>
    </beans>

    3)创建类User并创建对应的数据库,填充一些信息

    package com.entity;
    
    public class MyUser {
        private int id;
        private String name;
        private String password;
        private String phone;
        private String url;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getPhone() {
            return phone;
        }
    
        public void setPhone(String phone) {
            this.phone = phone;
        }
    
        public String getUrl() {
            return url;
        }
    
        public void setUrl(String url) {
            this.url = url;
        }
    }
    User类

    4)配置@Field 注解

    如果实体属性与配置文件定义的域名称不一致,需要在注解中指定域名称

     //@Field()里面的字段需要和solrhome的schema.xml 中域的name相同
        @Fieldprivate int id;
        @Field("item_name")
        private String name;
        @Field("item_password")
        private String password;
        @Field("item_phone")
        private String phone;
        @Field("item_url")
        private String url;

    5)在solrhome\collection1\conf\schema.xm配置文件中添加字段,添加后重启tomcat服务器

    <field name="item_name" type="text_ik" indexed="true" stored="true"/>
    <field name="item_password" type="string" indexed="true" stored="true"/>
    <field name="item_phone" type="string" indexed="false" stored="true" /> <field name="item_url" type="string" indexed="false" stored="true" /> <field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/> <copyField source="item_name" dest="item_keywords"/> <copyField source="item_password" dest="item_keywords"/> <copyField source="item_phone" dest="item_keywords"/> <copyField source="item_url" dest="item_keywords"/>

    6)创建测试类SolrTest

    package com.test;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.solr.core.SolrTemplate;
    import org.springframework.data.solr.core.query.Criteria;
    import org.springframework.data.solr.core.query.Query;
    import org.springframework.data.solr.core.query.SimpleQuery;
    import org.springframework.data.solr.core.query.result.ScoredPage;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import java.math.BigDecimal;
    import java.util.ArrayList;
    import java.util.List;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = "classpath:spring/applicationContext-solr.xml")
    public class SolrTest {
    
        @Autowired
        private SolrTemplate solrTemplate;
      //在此写操作,这些操作只是对solr的仓库的  
    }

    7)添加操作(在测试类中编写,下同)

     @Test
        public void add(){
            //把数据添加到solr中
            MyUser myUser=new MyUser();
            myUser.setId(1);
            myUser.setName("测试名");
            myUser.setPassword("1234");
            myUser.setUrl("baidu.com");
            solrTemplate.saveBean(myUser);
            solrTemplate.commit();
        }

    当执行后,在页面进行查询,会看到数据已经添加到solr仓库中了

    8)按主键查询

    @Test
        public void findById(){
            //按主键查询
            MyUser id = solrTemplate.getById(1, MyUser.class);
            System.out.println(id);//会把对应id的信息查询出来
        }

    9)按主键删除

       @Test
        public void deleteById(){
            //按主键删除
            solrTemplate.deleteById("1");
            solrTemplate.commit();
        }

    10)删除全部

       @Test
        public void deleteAll(){
            //删除全部
            Query query=new SimpleQuery("*:*");
            solrTemplate.delete(query);
            solrTemplate.commit();
        }
    

    11)批量导入数据 

     //批量导入数据 
      @Test
        public void addList(){
            List<MyUser> list=new ArrayList<MyUser>();
            for (int i = 0; i < 100; i++) {
                MyUser myUser=new MyUser();
                myUser.setId(1+i);
                myUser.setName("测试名"+i);
                myUser.setPassword("1234"+i);
                myUser.setUrl("baidu.com"+i);
                list.add(myUser);
            }
            //saveBeans添加list集合
            solrTemplate.saveBeans(list);
            solrTemplate.commit();
        }

    12)分页查询

        @Test
        public void findPage(){
            //分页查询
            Query query=new SimpleQuery("*:*");
            //设置起始索引
            query.setOffset(10);
            //设置每页显示的条数
            query.setRows(20);
            ScoredPage<MyUser> pages = solrTemplate.queryForPage(query, MyUser.class);
            //获取总记录数
            System.out.println("总记录数:"+pages.getTotalElements());
            //获取总页数
            System.out.println("总页数:"+pages.getTotalPages());
            //获取分页数据
            List<MyUser> list = pages.getContent();
            for (MyUser item : list) {
                System.out.println(item.getName()+" "+item.getUrl());
            }
        }

    13)有条件分页查询

     @Test
        public void findPageMutil(){
            //有条件分页查询
            Query query=new SimpleQuery("*:*");
            Criteria criteria=new Criteria("item_keywords");
            //contains包含(参数不可拆分),is是相等(参数可拆分)
            criteria.is("试名");
            query.addCriteria(criteria);
            //设置起始索引
            query.setOffset(10);
            //设置每页显示的条数
            query.setRows(20);
            ScoredPage<MyUser> pages = solrTemplate.queryForPage(query, MyUser.class);
            //获取总记录数
            System.out.println("总记录数:"+pages.getTotalElements());
            //获取总页数
            System.out.println("总页数:"+pages.getTotalPages());
            //获取分页数据
            List<MyUser> list = pages.getContent();
            for (MyUser item : list) {
                System.out.println(item.getName()+" "+item.getUrl());
            }
        }
    就是这么简单,你学废了吗?感觉有用的话,给笔者点个赞吧 !
  • 相关阅读:
    [Poi2000]病毒
    [Zjoi2015]诸神眷顾的幻想乡
    P1663 山
    P1837 单人纸牌
    P6584 重拳出击
    CF460C Present
    10.5 学习笔记
    多项式学习笔记(一) FFT
    NOIP 2020 游记
    uva 经典习题选做(dp专项)
  • 原文地址:https://www.cnblogs.com/zys2019/p/11587568.html
Copyright © 2011-2022 走看看