天天看點

solr的基本操作及整合springboot複制到容器重新開機容器

一、在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

讓配置檔案在容器中生效

複制到容器

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

重新開機容器

docker-compose restart

5)在solr的浏覽器用戶端中插入資料

6)查詢資料

7)删除資料

根據查詢結果删除

根據id來删除

二、在springboot中使用solr實作增删改查

1.添加依賴

    org.springframework.boot

    spring-boot-starter-data-solr

yml:

spring:

  data:

    solr:

      host:

http://192.168.2.143:8983/solr/ik_core

2.編寫javabean

3.往solr中插入資料

@Autowired

private TProductSearchDTOMapper mapper;

private SolrClient solrClient;

//将資料庫中擷取的資料,插入到solr庫中

@Test

public void insertDataToSolr() throws IOException, SolrServerException {

    //1.擷取資料庫中的資料

    List products = mapper.selectAll();

   //2.将資料插入到solr

    //用于存放所有solr資料的集合

    List 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)普通的查詢并封裝

    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("");

        query.setHighlightSimplePost("");

        //執行查詢.得到響應結果

        QueryResponse response = solrClient.query(query);

//        System.out.println(response);

        //封裝結果集==> List

        List 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

        //獲得資料結果集

        //獲得高亮結果集

        Map>> highlighting = response.getHighlighting();

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

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

            //==========從高亮結果集中那帶高亮效果的t_product_name=============

            Map> stringListMap = highlighting.get(stringId);

            List t_product_name1 = stringListMap.get("t_product_name");

            String t_product_name = t_product_name1.get(0);

            product.settProductPimage(t_product_pimage);

5.在solr中删除資料