一、Solr入门

1.1 对于数据库的查询的

select * from t_goods where goodsName like “%手机%” ;
问题:
1,这个查询速度快不快?
2,对于goodsName 是否添加了索引(假设我们添加了)
3,对于上面的sql 语句,是否会走索引?
索引的本质是一颗树,若我们使用(“%手机%” ) 查询时,它无法去比较大小,无法比较,就无法走索引!
那种场景走索引:最左匹配原则 goodsName like “手机%”,它会走索引。goodsName like “%手机” 它不会走索引。
既然不会走索引,它的查询速度,就需要来一个全表的扫描。它的速度会非常慢!
假设我们的数据有百万级别的,查询一个商品,可能就需要20s 左右!

1.2 使用Map 集合来做查询

Map<String,List>
我们在Map 集合的Key 放商品的关键字,value放商品的id的集合。
到时我们使用关键字查询商品的ids就可以了

1.3 怎么得到商品的关键字?

商品名称Eg:
【小米10 旗舰新品2月13日14点发布】小米10 骁龙865 5G 抢先预约抽壕礼
荣耀20S 李现同款 3200万人像超级夜景 4800万超广角AI三摄 麒麟810 全网通版
荣耀20i 3200万AI自拍 超广角三摄 全网通版6GB+64GB 渐变红 移动联通电信4G
Redmi 8A 5000mAh 骁龙八核处理器 AI人脸解锁 4GB+64GB 深海蓝 游戏老人手机

二、结巴分词模拟搜索商品

2.1 新建项目

IDEA创建空项目【solr-demo】->新建maven的moudule【sole-fenci-demo】–>添加依赖

dependencies><dependency><groupId>com.huaban</groupId><artifactId>jieba-analysis</artifactId><version>1.0.2</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version></dependency>
</dependencies>

2.3 测试项目

public class TestJieBa {//声明一个分词对象private static JiebaSegmenter jiebaSegmenter = new JiebaSegmenter();public static void main(String[] args) {String content="锤子(smartisan) 坚果Pro3 8GB+128GB 黑色 骁龙855PLUS 4800万四摄 全网通双卡双待 全面屏游戏手机";/**** @Description:* 参数1  要分词的内容* 参数1:分词模式*/List<SegToken> tokens = jiebaSegmenter.process(content, JiebaSegmenter.SegMode.SEARCH);for (SegToken token : tokens) {System.out.println(token.word);}System.out.println("分词完成"+tokens.size());}}

三、使用商品搜索案例来展示我们的Map集合

3.1 商品的模拟

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Goods {private Integer id;//商品IDprivate String goodsName;//商品名称private Double goodsPrice;//商品价格
}

3.2 模拟数据库

public class DBUtils {private static Map<Integer, Goods> db=new HashMap<>();public static void insert(Goods goods){db.put(goods.getId(),goods);}public static Goods getById(Integer id){return db.get(id);}/**** @Description:* @Param: 提供一个根据ids的集合查询商品的方法    key--->多个商品ID* @return:* @Author: * @Date: 2020/4/2*/public static List<Goods> getByIds(Set<Integer> ids){if(null==ids||ids.isEmpty()){return Collections.emptyList();}List<Goods> goods=new ArrayList<>();for (Integer id : ids) {Goods g = db.get(id);if(null!=g){goods.add(g);}}return goods;}
}

3.3 商品服务的接口GoodsService

public interface GoodsService {void insert(Goods goods);List<Goods> findByGoodsName(String goodsName);}

3.4 商品服务的实现(GoodsServiceImpl)

public class GoodsServiceImpl implements GoodsService {//模拟一个索引库private Map<String, Set<Integer>> indexs=new HashMap<>();private JiebaSegmenter jiebaSegmenter=new JiebaSegmenter();@Overridepublic void insert(Goods goods) {/**** 我们在插入商品时,要构造一个Map集合* Map<String,List<ID>/>*///分词List<String> keywords= this.fenci(goods.getGoodsName());//插入数据DBUtils.insert(goods);//保存到分词的关键字和ids的映射关系saveKeyWords(keywords,goods.getId());}/*** @Description: 保存分词和id的关系* @Param: [keywords, id]* @return: void* @Author:* @Date: 2020/4/2*/private void saveKeyWords(List<String> keywords, Integer id) {if(null!=keywords&&!keywords.isEmpty()){for (String keyword : keywords) {if(indexs.containsKey(keyword)){//先看关键字在索引里面是否存在Set<Integer> integers = indexs.get(keyword);//得到这个关键字对应该的已存在的ids集合integers.add(id);//把新插入的id放入}else{//这是一个新词,之前的索引库不存在HashSet<Integer> ids = new HashSet<>();ids.add(id);indexs.put(keyword,ids);}}}}/**** @Description: 完成分词* @Param: [goodsName]* @return: java.util.List<java.lang.String>* @Author: * @Date: 2020/4/2*/private List<String> fenci(String goodsName) {List<SegToken> tokens = jiebaSegmenter.process(goodsName, JiebaSegmenter.SegMode.SEARCH);List<String> keywords=new ArrayList<>(tokens.size());for (SegToken token : tokens) {keywords.add(token.word);}return keywords;}/**** @Description: * @Param: [goodsName]* @return: java.util.List<com.leige.solr.test.domain.Goods>* @Author: * @Date: 2020/4/2*/@Overridepublic List<Goods> findByGoodsName(String goodsName) {//直接从Map里面取有没有if(indexs.containsKey(goodsName)){Set<Integer> ids = indexs.get(goodsName);//取出有goodsName里面有传过来的goodsName商品的IDList<Goods> goodsList = DBUtils.getByIds(ids);return goodsList;}return Collections.emptyList();}
}

3.5 测试类

public class TestApp {public static void main(String[] args) {GoodsService goodsService = new GoodsServiceImpl();Goods goods = new Goods(1,"苹果手机",10.00) ;Goods goods1 = new Goods(2,"华为手机",11.00) ;Goods goods2 = new Goods(3,"红米手机",5.00) ;Goods goods3 = new Goods(4,"联想手机",6.00) ;goodsService.insert(goods);goodsService.insert(goods1);goodsService.insert(goods2);goodsService.insert(goods3);List<Goods> goodss = goodsService.findByGoodsName("手机");for (Goods goodsTest : goodss) {System.out.println(goodsTest);}}
}

3.6 我们在搜索苹果手机时,搜索不出来结果

修改GoodsService

修改GoodsService
List<Goods> findByKeyWord(String keyword);

修改GoosServiceImpl

@Override
public List<Goods> findByKeyWord(String keyword) {//先分词  再查询List<String> stringList = this.fenci(keyword);Set<Integer> idsSet = new HashSet<>();for (String kw : stringList) {//直接从Map里面取有没有if(indexs.containsKey(kw)){Set<Integer> ids = indexs.get(kw);//取出有goodsName里面有传过来的goodsName商品的IDidsSet.addAll(ids);}}if(idsSet.isEmpty()){return Collections.emptyList();}else{return DBUtils.getByIds(idsSet);}
}

修改TestApp测试

3.7 搜索速度的提升

之前:是需要把数据库做一个全表的扫描
现在:直接通过计算hash值定位 值,在非常理想的情况下。他的速度,只计算一次

3.8 新的问题

我们的一句话会分出来很多的关键字,都给他建立<K,List> 我们的Map 里面将容纳非常多的元素!
那我们往Map 集合里面放元素时,将有29 个被放进去!若成千上万的商品,那Map 集合非常大!怎么解决Map 集合无限扩大的问题?

【Solr】之使用结巴分词模拟搜索商品1相关推荐

  1. mysql使用结巴语句_结巴分词 java 高性能实现,是 huaban jieba 速度的 2倍

    Segment Segment 是基于结巴分词词库实现的更加灵活,高性能的 java 分词实现. 创作目的 分词是做 NLP 相关工作,非常基础的一项功能. jieba-analysis 作为一款非常 ...

  2. [solr] solr5.5.2配置结巴分词工具

    为什么选择结巴分词 分词效率高 词料库构建时使用的是jieba (python) 结巴分词Java版本 下载 git clone https://github.com/huaban/jieba-ana ...

  3. 【转载】solr教程,值得刚接触搜索开发人员一看

    转载:http://blog.csdn.net/awj3584/article/details/16963525 Solr调研总结 开发类型 全文检索相关开发 Solr版本 4.2 文件内容 本文介绍 ...

  4. solr教程,值得刚接触搜索开发人员一看(转载:http://blog.csdn.net/awj3584/article/details/16963525)

    Solr调研总结 开发类型 全文检索相关开发 Solr版本 4.2 文件内容 本文介绍solr的功能使用及相关注意事项;主要包括以下内容:环境搭建及调试;两个核心配置文件介绍;维护索引;查询索引,和在 ...

  5. solr教程,值得刚接触搜索开发人员一看

    http://blog.csdn.net/awj3584/article/details/16963525 Solr调研总结 开发类型 全文检索相关开发 Solr版本 4.2 文件内容 本文介绍sol ...

  6. redis+结巴分词做倒排索引

    起源 之前爬取过一百万的歌曲,包括歌手名,歌词等,最近了解到倒排索引,像es,solr这种太大,配置要求太高,对于一百万的数据量有些小题大做,所以想到了redis做一个倒排索引. 我的配置 这里说一下 ...

  7. python 商品名称相似度查找(difflib库和结巴分词的运用)

    今天同事被告知要写一个查询商品相似度的系统,我以为事类似推荐系统一样的高大上系统,心中暗自庆幸没有被委以如此重任,不然在紧迫的时间里学习实现这套系统一定会睡眠不足的,后来同事讲解后我才知道只是一个商品 ...

  8. solr 教程,值得刚接触搜索开发人员一看

    2019独角兽企业重金招聘Python工程师标准>>> 1. Solr 是什么? Solr它是一种开放源码的.基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序 ...

  9. python分词统计词频_基于结巴分词做的全文分词统计词频小脚本

    受朋友之托,写一个小脚本,断断续续做了两天,写一下两天的收获. 起因 有个朋友说专业文档很枯燥难懂,需要一个能把全文的关键词找出来并排序的东西,找不到现成的,问我能不能做一个.我前些天也听车神说有关分 ...

最新文章

  1. 苹果 2020 iPhone 展望:相机大升级,5G 首次接入
  2. UML中聚合和组合的关系(笔记)
  3. SpringMVC源码解析
  4. DirectFB编译环境
  5. python对律师的作用_想知道在大家眼中律师的作用是什么
  6. css平台HTDC币,是否应该从最新的设置中应用CSS规则?
  7. ASP.net:命名空间“System.Xml”中不存在类型(是缺少程序集引用吗?)
  8. DCMTK:测试dcmseg的DcmSegUtils功能
  9. java拷贝函数_Java的深拷贝与浅拷贝的几种实现方式
  10. 【目标检测_CentripetalNet】CentripetalNet: Pursuing High-quality Keypoint Pairs for Object Detection_2020
  11. 使用 OpenCL.Net 进行 C# GPU 并行编程
  12. 数据结构之树和二叉树的应用:二叉排序树(BST)
  13. 漫画: 可以给女朋友讲解 Linux 内核长啥样了
  14. 局部敏感哈希(lsh)包安装成功
  15. AR9331中Linux内核启动中与IRQ中断相关的文件
  16. linux c 数组拷贝,C++对数组进行复制 - osc_8iux0cyz的个人空间 - OSCHINA - 中文开源技术交流社区...
  17. VSTO 实现word的多级列表功能
  18. 计算机比赛训练总结500字,比赛活动总结500字(精选7篇)
  19. 【Hadoop实训】统计文件中所有单词的平均长度
  20. java的concurrenthashmap和hashtab

热门文章

  1. k8s拉取镜像规则_【大强哥-k8s从入门到放弃13】Service详解
  2. 恶意程序利用Linksys路由器漏洞在路由器中传播
  3. 基于Linux的及时通信软件
  4. 什么是网络攻击?网络攻击手段有哪些?
  5. Linux操作系统的性能将主要取决于,高校邦Linux操作系统安全与性能调优章节测试答案...
  6. scratch聪明的小猫 电子学会图形化编程scratch等级考试四级真题和答案解析2021-12
  7. untiy TextMeshPro(简称TMP)组件详细内容
  8. 名帖203 米芾 行书《行书帖选》
  9. webpack 打包异常 unhandledRejection 错误详情查看
  10. 音符和频率的对应关系计算