资讯专栏INFORMATION COLUMN

sorl实现商品快速搜索

genefy / 2305人阅读

摘要:概述是的一个顶级开源项目,采用开发,它是基于的全文搜索服务器。提供了比更为丰富的查询语言,同时实现了可配置可扩展,并对索引搜索性能进行了优化。搜索只需要发送请求,然后对返回等格式的查询结果进行解析,组织页面布局。

Solr概述

Solr 是Apache的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
Solr可以独立运行在Jetty、Tomcat等这些Servlet容器中,Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr根据xml文档添加、删除、更新索引 。Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。

Docker安装Solr服务

拉取 Solr 镜像:docker pull solr:7.4.0

启动 Solr 容器docker run --name taotao-solr -d -p 8983:8983 -t solr:7.4.0

访问 http://114.115.215.xxx:8983/

Solr界面功能

新建core
docker exec -it --user=solr mysolr bin/solr create_core -c shop
安装中文分词器、并设置业务系统Field

分词器安装参考文章:https://github.com/ik-analyzer

文件传输传输参考:Docker容器和本机之间的文件传输

传jar包和配置文件

wget方式把jar包下载到根目录:

wget https://search.maven.org/remotecontent?filepath=com/github/magese/ik-analyzer/7.7.0/ik-analyzer-7.7.0.jar

找到容器长ID:docker inspect my-solr | grep Id

将jar包放入Solr服务的webapp/WEB-INF/lib/目录下

docker cp /root/ik-analyzer-7.6.0.jar 9d7cf2c5315e405e7a8cadc40dcef93fd893f39f0cf70ad42c3b1b70729d2423:/opt/solr/server/solr-webapp/webapp/WEB-INF/lib

将resources目录下的5个配置文件放入solr服务的webapp/WEB-INF/classes/目录下;

① IKAnalyzer.cfg.xml
② ext.dic
③ stopword.dic
④ ik.conf
⑤ dynamicdic.txt
配置managed-schema

进入solr容器:docker exec -it -u root my-solr /bin/bash

编辑managed-schema文件:vim /opt/solr/server/solr/shop/conf/managed-schema

把下面一段加到最后



  
      
      
  
  
      
      
  













别忘了重启容器:docker restart my-solr
代码解释:加了type="text_ik"表示这个字段使用分词器分拆,表示把这个字段加入一个之前创建新的集合item_keywords中,以后使用这个字段检索可达到全文检索的目的。

尝试把一条商品信息导入到Solr库中

新建springboot项目,加依赖:


    org.apache.solr
    solr-solrj
    7.7.1

配置文件添加:

spring.data.solr.host=http://114.115.215.xxx:8983/solr

核心代码:

@RestController
public class HelloController {
    @Autowired
    private SolrClient client;
    @RequestMapping("/hello")
    public Object hello() throws IOException, SolrServerException {
        SolrInputDocument doc = new SolrInputDocument();
        List list= itemInfoMapper.findAll();
        doc.setField("item_title","Apple iPhone X (A1865) 64GB 深空灰色 移动联通电信4G手机");
        doc.setField("item_sell_point","【抢券立减200元!】5.8英寸视网膜全面屏,无线充电,面容ID,1200万后置双摄。");
        doc.setField("item_price",6299.00);
        doc.setField("item_category_name","手机");
        doc.setField("item_desc","单卡单待网络制式:4G LTE全网通机身内存:64GB4G LTE网络特性:移动4G");
        client.add("shop",doc);
        client.commit("shop");
        return "ok";
    }
}

测试:

为什么这么多数据,不是只加了一条嘛? 我已经走完了下面一步,这里只是为了演示给你看。

把数据库中所有商品信息导入索引库

先把mysql、mybatis依赖全部加进来

新建实体类

public class Item {
    private Long id;
    private String title;
    private String sell_point;
    private Long price;
    private String image;
    private String category_name;
}

dao层

public interface ItemInfoMapper {
    @Select("SELECT
" +
            "	a.id,
" +
            "	a.title,
" +
            "	a.sell_point,
" +
            "	a.price,
" +
            "	a.image,
" +
            "	b. NAME category_name
" +
            "FROM
" +
            "	tb_item a
" +
            "LEFT JOIN tb_item_cat b ON a.cid = b.id")
    List findAll();
}

记得让springboot扫描哦

@SpringBootApplication
@MapperScan("com.yungou.shop.shopsearch.Mapper")
public class ShopSearchApplication {
    public static void main(String[] args) {
        SpringApplication.run(ShopSearchApplication.class, args);
    }
}

下面开发核心代码了,登登登登:

@RestController
public class HelloController {
    @Autowired
    private SolrClient client;
    @Autowired
    private ItemInfoMapper itemInfoMapper;
    @RequestMapping("/hello")
    public Object hello() throws IOException, SolrServerException {
        SolrInputDocument doc = new SolrInputDocument();
        List list= itemInfoMapper.findAll();
        for (ItemInfo itemInfo:list){
            doc.setField("item_title",itemInfo.getTitle());
            doc.setField("item_sell_point",itemInfo.getSell_point());
            doc.setField("item_price",itemInfo.getPrice());
            doc.setField("item_category_name",itemInfo.getCategory_name());
            client.add("shop",doc);
        }
        client.commit("shop");
        return "ok"+list.size();
    }
}

让数据加载一会,数据多的话可能要等几分钟。

回到管理界面

我们看到已经有6666条数据加载进来了,大功告成,666!

总结

经过这个案例,应该是把线上部署的大多数情况都过了一遍。享受docker部署便利的同时,由于第一次操作docker文件,这里耗了点时间。最蠢的事情是明明加入的是text_ik,自己一直在搜ik,怎么搜来搜去搜不到,明明已经启动成功了呀。然后弄来弄去才发现,也费了点时间。警惕自己以后一定要细心,注意细节呀。除此之外,其他的都比较顺利。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27712.html

相关文章

  • 电商参考架构第一部分:搭建一个灵活、可搜索、响应快速的产品目录系统

    摘要:因为他们可能会有许多顾客对相同的商品目录进行多次请求。然而,对于我们的参考架构,我们想完全在中实现一个多方面搜索。 本文源地址:http://www.mongoing.com/blog/retail-reference-architecture-part-1 如今,产品目录数据管理对零售商而言是一个非常复杂的问题。经过多年对多个庞大、由供应商提供的系统的依赖之后,零售商目前正在重新考...

    VincentFF 评论0 收藏0
  • 电商参考架构第一部分:搭建一个灵活、可搜索、响应快速的产品目录系统

    摘要:因为他们可能会有许多顾客对相同的商品目录进行多次请求。然而,对于我们的参考架构,我们想完全在中实现一个多方面搜索。 本文源地址:http://www.mongoing.com/blog/retail-reference-architecture-part-1 如今,产品目录数据管理对零售商而言是一个非常复杂的问题。经过多年对多个庞大、由供应商提供的系统的依赖之后,零售商目前正在重新考...

    Gemini 评论0 收藏0
  • 阿里副总裁玄难:藏经阁计划首次在阿里应用落地

    摘要:在全国知识图谱与语义计算大会上,阿里巴巴集团副总裁藏经阁计划阿里负责人墙辉玄难宣布藏经阁计划首次在阿里应用落地,以及首次披露大规模知识构建技术细节,并从三个方面进行了解读。 2018年4月,阿里联合清华大学、浙江大学、中科院自动化所、中科院软件所、苏州大学等五家机构,联合发布藏经阁(知识引擎)研究计划,同时还宣布打算用一年时间初步建成首个开放的知识引擎服务平台,服务社会。 在全国知识图...

    CompileYouth 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<