首页技术文章正文

SpringDataSolr的入门【黑马java培训】

更新时间:2019年07月26日 10时53分09秒 来源:黑马程序员论坛



【上海校区】SpringDataSolr的入门

Solr和SpringDataSolr的关系

solr 作为一个企业及应用,可以理解为一个搜索引擎的大体上的成品。solr的使用 是通过它提供的若干接口,而Spring Data Solr 是spring 调用solr接口的 进一步封装,简化了solr的使用,可以通过spring-data-solr提供的对象 HttpSolrServer 对文档索引的创建、搜索、分组、排序、分页等等进行操控。功能还是较为完善的。


准备工作和测试

第一步:配置solr服务的域

在你的solr服务所对应的本地库中,找到schema.xml的添加如下域

[XML] 纯文本查看 复制代码
  <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_updatetime" type="date" 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" />        


第二步:引入相关的依赖和JDK插件
[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>

    <build>

        <plugins>
            <!-- java编译插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

        </plugins>

    </build>

第三步:创建实体和编写属性相关的字段映射

自行提供setter和getter方法
[XML] 纯文本查看 复制代码
public class TbItem implements Serializable {

    @Field
    private Long id;

    @Field("item_title")
    private String title;

    @Field("item_price")
    private BigDecimal price;

    @Field("item_image")
    private String image;

    @Field("item_goodsid")
    private Long goodsId;

    @Field("item_category")
    private String category;

    @Field("item_brand")
    private String brand;

    @Field("item_seller")
    private String seller;

}


第四步:编写applicationContext-solr.xml
[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">

    <context:component-scan base-package="com.pinyougou.solrutil">
    </context:component-scan>

    <!-- solr服务器地址 -->
    <solr:solr-server id="solrServer" url="http://127.0.0.1:8080/solr/collection1" />

    <!-- solr模板,使用solr模板可对索引库进行CRUD的操作 -->
    <bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">

        <constructor-arg ref="solrServer" />

    </bean>
</beans>


第五步:进行Solr的集成测试
[Java] 纯文本查看 复制代码
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext-solr.xml")
public class SpringDataSolrTest {

    @Autowired
    private SolrTemplate solrTemplate;

    //集成测试对应的单元
}


在对应的集成测试单元处编写测试方法

1、添加单个对象到solr
[Java] 纯文本查看 复制代码
    /**
     * 添加单个对象到solr
     */

    @Test
    public void beanAddSolr(){

        TbItem item=new TbItem();

        item.setId(1L);

        item.setBrand("华为");

        item.setCategory("手机");

        item.setGoodsId(1L);

        item.setSeller("华为2号专卖店");

        item.setTitle("华为Mate9");

        item.setPrice(new BigDecimal(2000));

        solrTemplate.saveBean(item);

        solrTemplate.commit();
    }


2、根据主键查询
[Java] 纯文本查看 复制代码
    /**
     * 根据主键查询
     */

    @Test
    public void findSolrById(){

        TbItem item = solrTemplate.getById(1, TbItem.class);

        System.out.println(item.getTitle());
    }


3、根据主键删除
[Java] 纯文本查看 复制代码
  /**
     * 根据主键删除
     */

    @Test
    public void deleteSolrById(){

        UpdateResponse response = solrTemplate.deleteById("1");

        solrTemplate.commit();
    }


4、批量导入索引
[Java] 纯文本查看 复制代码
    /**
     * 将List集合中的对象添加到solr中
     */

    @Test
    public void beanListAddSolr(){

        List<TbItem> list=new ArrayList();

        for(int i=0;i<100;i++){

            TbItem item=new TbItem();

            item.setId(i+1L);

            item.setBrand("华为");

            item.setCategory("手机");

            item.setGoodsId(1L);

            item.setSeller("华为2号专卖店");

            item.setTitle("华为Mate"+i);

            item.setPrice(new BigDecimal(2000+i));

            list.add(item);
        }

        solrTemplate.saveBeans(list);

        solrTemplate.commit();
    }


5、分页查询

[Java] 纯文本查看 复制代码
    /**
     * 分页查询
     */

    @Test
    public void testPageQuery(){

        Query query=new SimpleQuery("*:*");

        //开始索引(默认0)
        query.setOffset(1);

        //每页记录数(默认10)
        query.setRows(20);

        ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class);

        System.out.println("总记录数:"+page.getTotalElements());

        List<TbItem> list = page.getContent();

        showList(list);
    }

    //显示记录数据
    private void showList(List<TbItem> list){

        for(TbItem item:list){

            System.out.println(item.getTitle() +item.getPrice());
        }
    }

    /**
     * 用于条件的封装
     */

    @Test
    public void testPageQueryMutil(){

        Query query=new SimpleQuery("*:*");

        Criteria criteria=new Criteria("item_title").contains("2");

        criteria=criteria.and("item_title").contains("5");

        query.addCriteria(criteria);

        //query.setOffset(20);//开始索引(默认0)
        //query.setRows(20);//每页记录数(默认10)
        ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class);

        System.out.println("总记录数:"+page.getTotalElements());

        List<TbItem> list = page.getContent();

        showList(list);
    }


6、高亮查询
[Java] 纯文本查看 复制代码
    @Test
    public void queryPageAndHightFromSolr(){

//        Query query=new SimpleQuery("item_title:手机");

        SimpleHighlightQuery query = new SimpleHighlightQuery();

        //开始索引(默认0)
        query.setOffset(1);

        //每页记录数(默认10)
        query.setRows(20);


        //设置高亮的域
        HighlightOptions highlightOptions = new HighlightOptions().addField("item_title").addField("item_category");


        //高亮前缀
        highlightOptions.setSimplePrefix("<em style='color:red'>");

        //高亮后缀
        highlightOptions.setSimplePostfix("</em>");

        //设置高亮选项
        query.setHighlightOptions(highlightOptions);


        //添加查询条件
        Criteria criteria = new Criteria("item_keywords").is("手机");

        query.addCriteria(criteria);

        HighlightPage<TbItem> items = solrTemplate.queryForHighlightPage(query, TbItem.class);

        List<HighlightEntry<TbItem>> highlighted = items.getHighlighted();

        for (HighlightEntry<TbItem> temHighlightEntry : highlighted) {

            List<HighlightEntry.Highlight> highlights = temHighlightEntry.getHighlights();


            TbItem item = temHighlightEntry.getEntity();

            for (HighlightEntry.Highlight highlight : highlights) {

                List<String> snipplets = highlight.getSnipplets();


                Field field = highlight.getField();

                String name = field.getName();

                for (String snipplet : snipplets) {

                    if ("item_title".equals(name)) {

                        item.setTitle(snipplet);
                    }

                    if ("item_category".equals(name)) {

                        item.setCategory(snipplet);
                    }
//                    System.out.println("snipplet = " + snipplet);
                }
            }


        }

       


        for (TbItem item : items) {

            System.out.println(item.getTitle());

            System.out.println("------------------------------");

            System.out.println(item.getCategory());
        }
        

    }


7、清空索引
[Java] 纯文本查看 复制代码
    /**
     * 删除solr全部数据
     */

    @Test
    public void deleteAllSolr(){

        Query query=new SimpleQuery("*:*");

        solrTemplate.delete(query);

        solrTemplate.commit();
    }







推荐了解热门学科

java培训 Python人工智能 Web前端培训 PHP培训
区块链培训 影视制作培训 C++培训 产品经理培训
UI设计培训 新媒体培训 产品经理培训 Linux运维
大数据培训 智能机器人软件开发




传智播客是一家致力于培养高素质软件开发人才的科技公司“黑马程序员”是传智播客旗下高端IT教育品牌。自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研3个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,针对性地出版了计算机系列教材50多册,制作教学视频数+套,发表各类技术文章数百篇。

传智播客从未停止思考

传智播客副总裁毕向东在2019IT培训行业变革大会提到,“传智播客意识到企业的用人需求已经从初级程序员升级到中高级程序员,具备多领域、多行业项目经验的人才成为企业用人的首选。”

中级程序员和初级程序员的差别在哪里?
项目经验。毕向东表示,“中级程序员和初级程序员最大的差别在于中级程序员比初级程序员多了三四年的工作经验,从而多出了更多的项目经验。“为此,传智播客研究院引进曾在知名IT企业如阿里、IBM就职的高级技术专家,集中研发面向中高级程序员的课程,用以满足企业用人需求,尽快补全IT行业所需的人才缺口。

何为中高级程序员课程?

传智播客进行了定义。中高级程序员课程,是在当前主流的初级程序员课程的基础上,增加多领域多行业的含金量项目,从技术的广度和深度上进行拓展“我们希望用5年的时间,打造上百个高含金量的项目,覆盖主流的32个行业。”传智播客课程研发总监于洋表示。




黑马程序员热门视频教程【点击播放】

Python入门教程完整版(懂中文就能学会) 零起点打开Java世界的大门
C++| 匠心之作 从0到1入门学编程 PHP|零基础入门开发者编程核心技术
Web前端入门教程_Web前端html+css+JavaScript 软件测试入门到精通


在线咨询 我要报名
和我们在线交谈!