绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
solr的基本操作及整合springboot
2020-06-03 13:36:00

一、在solr中插入数据

{

"id": 536563,

"tb_item_cid": 560,

"tb_item_cname": "手机",

"tb_item_title": "new2 - 阿尔卡特 (OT-927) 炭黑 联通3G手机 双卡双待",

"tb_item_sell_point": "清仓!仅北京,武汉仓有货!"

}


在solr中插入的数据,这些数据的字段都需要在solr中进行“注册”,被“注册”过的字段,就可以支持分词,因此这些数据就可以被查询。

1.在solr中“注册”字段

1)搜索出来以后的数据是什么样的,这样的数据才会存入到solr中

搜索出来的数据主需要有部分字段,

因此,通过设计一个专门用于存放solr中的数据的模型(javabean),来先获取这样的所有的数据,然后再存到solr里。

2)设计javabean


商品id

商品名称

商品实际售价

商品图片

商品描述


3)根据javabean中的属性设计sql语句

SELECT

a.pid as id,

a.pname as t_product_name,

a.sale_price as t_product_sale_price,

a.pimage as t_product_pimage,

b.pdesc as t_product_pdesc

FROM

t_product a

LEFT JOIN t_product_desc b

ON a.pid = b.`pid`


4)在solr中注册字段


编辑ik配置文件: managed_schema

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

<field name="t_product_sale_price" type="pfloat" indexed="true" stored="true"/>

<field name="t_product_pimage" type="text_general" indexed="true" stored="true"/>

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

让配置文件在容器中生效

# 复制到容器

docker cp managed-schema solr:/opt/solr/server/solr/ik_core/conf


# 重启容器

docker-compose restart



5)在solr的浏览器客户端中插入数据



6)查询数据



7)删除数据

根据查询结果删除




根据id来删除








二、在springboot中使用solr实现增删改查

1.添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>

yml:

spring:

  data:

    solr:

      host: http://192.168.2.143:8983/solr/ik_core


2.编写javabean



3.往solr中插入数据

@Autowired

  private TProductSearchDTOMapper mapper;

  

  @Autowired

  private SolrClient solrClient;

  

  

  //将数据库中获取的数据,插入到solr库中

  @Test

  public void insertDataToSolr() throws IOException, SolrServerException {

  

    //1.获取数据库中的数据

    List<TProductSearchDTO> products = mapper.selectAll();

   //2.将数据插入到solr

    //用于存放所有solr数据的集合

    List<SolrInputDocument> documents = new ArrayList<>();

    //封装Document对象

    for (TProductSearchDTO product : products) {

        SolrInputDocument document = new SolrInputDocument();

        document.addField("id",product.getId());

        document.addField("t_product_name",product.gettProductName());

        document.addField("t_product_sale_price",product.gettProductSalePrice().floatValue());

        document.addField("t_product_pimage",product.gettProductPimage());

        document.addField("t_product_pdesc",product.gettProductPdesc());

        //存入到集合中

        documents.add(document);

    }

    //提交给solr客户端

    solrClient.add(documents);

    //commit

    solrClient.commit();

}



4.在solr中查询数据

1)普通的查询并封装

@Autowired

    private SolrClient solrClient;

  

    //查询solr库

    @Test

    public void testQueryFromSolr() throws IOException, SolrServerException {

  

  //        String keyword = "t_product_name:手机"; //指定字段查询

        //复制域查询

        String  keyword = "手机";

        //创建查询对象

        SolrQuery query = new SolrQuery();

        //往对象中设置参数

  

        query.set("df","t_product_keywords");//复制域查询

        query.setQuery(keyword);

        query.setStart(0);

        query.setRows(10);

        //高亮

        query.addHighlightField("t_product_name");

        query.setHighlight(true);

        query.setHighlightSimplePre("<span style='color:red'>");

        query.setHighlightSimplePost("</span>");

        //执行查询.得到响应结果

        QueryResponse response = solrClient.query(query);

  //        System.out.println(response);

  

        //封装结果集==> List<TProductSearchDTO>

  

        List<TProductSearchDTO> products = new ArrayList<>();

  

        SolrDocumentList results = response.getResults();

        for (SolrDocument document : results) {

            TProductSearchDTO product = new TProductSearchDTO();

            Long id = Long.parseLong((String) document.getFieldValue("id"));

            product.setId(id);

            String t_product_name = (String) document.getFieldValue("t_product_name");

            product.settProductName(t_product_name);

            Float t_product_sale_price = (Float) document.getFieldValue("t_product_sale_price");

            product.settProductSalePrice(new BigDecimal(t_product_sale_price));

            String t_product_pimage = (String) document.getFieldValue("t_product_pimage");

            product.settProductPimage(t_product_pimage);

            String t_product_pdesc = (String) document.getFieldValue("t_product_pdesc");

            product.settProductPdesc(t_product_pdesc);

  

            products.add(product);

  

        }

        System.out.println(products);

  

  

    }



2)带高亮的查询并封装

  @Autowired

    private SolrClient solrClient;

  

    //查询solr库

    @Test

    public void testQueryFromSolr() throws IOException, SolrServerException {

  

  //        String keyword = "t_product_name:手机"; //指定字段查询

        //复制域查询

        String  keyword = "手机";

        //创建查询对象

        SolrQuery query = new SolrQuery();

        //往对象中设置参数

  

        query.set("df","t_product_keywords");//复制域查询

        query.setQuery(keyword);

        query.setStart(0);

        query.setRows(10);

        //高亮

        query.addHighlightField("t_product_name");

        query.setHighlight(true);

        query.setHighlightSimplePre("<span style='color:red'>");

        query.setHighlightSimplePost("</span>");

        //执行查询.得到响应结果

        QueryResponse response = solrClient.query(query);

  //        System.out.println(response);

  

        //封装结果集==> List<TProductSearchDTO>

  

        List<TProductSearchDTO> products = new ArrayList<>();

  

        //获得数据结果集

        SolrDocumentList results = response.getResults();

        //获得高亮结果集

        Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();

  

        for (SolrDocument document : results) {

            TProductSearchDTO product = new TProductSearchDTO();

            String stringId = (String) document.getFieldValue("id");

            Long id = Long.parseLong(stringId );//89983

            product.setId(id);

  

            //==========从高亮结果集中那带高亮效果的t_product_name=============

            Map<String, List<String>> stringListMap = highlighting.get(stringId);

            List<String> t_product_name1 = stringListMap.get("t_product_name");

            String t_product_name = t_product_name1.get(0);

            product.settProductName(t_product_name);

  

            Float t_product_sale_price = (Float) document.getFieldValue("t_product_sale_price");

            product.settProductSalePrice(new BigDecimal(t_product_sale_price));

            String t_product_pimage = (String) document.getFieldValue("t_product_pimage");

            product.settProductPimage(t_product_pimage);

            String t_product_pdesc = (String) document.getFieldValue("t_product_pdesc");

            product.settProductPdesc(t_product_pdesc);

  

            products.add(product);

  

        }

        System.out.println(products);

  

  

    }





5.在solr中删除数据

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Elasticsearch
创建时间:2020-05-22 14:49:51
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。我们建立一个网站或应用程序,并要添加搜索功能,但是想要完成搜索工作的创建是非常困难的。我们希望搜索解决方案要运行速度快,我们希望能有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP来索引数据,我们希望我们的搜索服务器始终可用,我们希望能够从一台开始并扩展到数百台,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。因此我们利用Elasticsearch来解决所有这些问题及可能出现的更多其它问题。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 栈栈
    专家
戳我,来吐槽~