1.技术选型,为什么用solr而不用lucene,或者其他检索工具
lucene:需要开发者自己维护索引文件,在多机环境中备份同步索引文件很是麻烦
Lucene本质上是搜索库,不是独立的应用程序。而Solr是。 Lucene专注于搜索底层的建设,而Solr专注于企业应用。 Lucene不负责支撑搜索服务所必须的管理,而Solr负责。 一句话概括Solr: Solr是Lucene面向企业搜索应用的扩展
其实相识的技术还有ElasticSearch,但是ES只支持json文件格式,需要靠第三方插件提供功能,其他传统的搜索应用也不如solr,所以我们用的solr。在建立索引的时候我们通过managed-schema文件配置ik分词器来完成中文分词,从而实现了高亮显示关键字,分页,多字段,多性能的搜索。
3.solr怎么建立、删除索引?
在solr中创建索引的一般步骤:
1)创建一个SolrServer对象,SolrServer用于管理索引
2)创建SolrInputDocument对象,即文档对象,并且向文档对象添加字段
3)利用SolrServer对象的add方法添加SolrInputDocument对象,创建索引
删除索引有两种方式:一种是通过文档ID进行删除,用server.deleteById(id)方法删除,可以批量删除;
第二种是通过查询到的结果删除,用server.deleteByQuery()方法;
Solr存的什么数据类型?
文本类型textfield
搜索需要用到的字段有哪些?
商品ID、商品名称、卖点、价格、商品分类名称、商品描述、商品图片;
solr的高亮显示怎么做的?
solr 默认已经配置了highlight 组件。"hl=true"是开启高亮,"hl.fl " 是告诉solr 对那些字段进行高亮(如果你想对多个字段进行高亮,可以添加多个字段,字段间用逗号隔开,如 "hl.fl=name,name2,name3")。 高亮内容与关键匹配的地方,默认将会被 "<em>" 和 "</em>" 包围。还可以使用hl.simple.pre" 和 "hl.simple.post"参数设置
solr的特性和solr集群的优点;
(1)大数据量下更高的性能
(2)更好扩展性
(3)更高的可靠性
(4)更简单易用
solr使用步骤
第一步:把solrJ的jar包添加到工程中。
第二步:创建一个SolrServer,使用HttpSolrServer创建对象。
第三步:创建一个文档对象SolrInputDocument对象。
第四步:向文档中添加域。必须有id域,域的名称必须在schema.xml中定义。
第五步:把文档添加到索引库中。
第六步:提交。
2.高亮的使用步骤
第一步:开启高亮显示
第二步:设置高亮域
第三步:标签进行包裹
第四步:填回实体对象
第五步:返回前台
那你给我说说IK分词器是什么?
我在做solr的时候使用的是IK分词器,IK分析器的分词原理本质上是词典分词。现在内存中初始化一个词典,然后在分词过程中逐个读取字符,和字典中的字符相匹配,把文档中的所有的词语拆分出来的过程。
问:你在做solr的时候是怎么用的分词器?
我们首先要下载对应的IK分词器版本,把IK目录下的三个文件为:分词器的jar包、分词器配置文件、分词器停词字典复制到tomact/webapps/solr/WEBINF/lib目录下,之后修改schema.xml。之后增加中文分词配置
问:你在做solr的时候遇到问题了吗?
多条件查询时出现了高亮不能显示的问题,分析了代码后发现我是对查询条件的集合booleanQuery进行的高亮,而实际上只对标题进行高亮就可以了,所以在多条件查询的时候高亮显示不出来,最后只需要对标题的那个Query加高亮就行了
遇到的索引库不同步的问题,我是使用定时任务框架来解决的
5.定时任务 在从数据中取数据生成索引的时候,因为表中的数据量比较大,防止一次取出所导致内存溢出问题,我采用了分段批量提取的方式进行,除此之外我们对后续增加的数据根据优先级的不同采取不同的策略,对于那些需要及时显示的数据我们通过spring定时器 在短时间内(30分钟)进行增量索引的生成,对于那些不需要及时展示的数据,我们通过spring定时器在服务器相对空闲的时候(比如每天晚上凌晨)进行索引的重新生成。此外我们为了提高solr的搜索的性能对其进行主从复制。
- :activeMQ应用场景:添加商品时需要将索引同步到数据库(这时候的manage-service充当消息的),当调用商品添加功能时,索引库并不会更新,此时如果对商品进行搜索,那么将无法获取到最新商品,所以需要当商品添加时,告诉索引库及时更新,此时activeMQ就充当了消息中间健的作用,当商品更新时,他就是消息生产者,通过activeMQ传达给消息消费者进行索引更新solrcloud:solrcloud是solr提供的,基于solr和zookeeper的分布式搜索方案应用场景
- activeMQ应用场景:添加商品时需要将索引同步到数据库(这时候的manage-service充当消息的),
当调用商品添加功能时,索引库并不会更新,此时如果对商品进行搜索,那么将无法获取到最新商品,所以需要当商品添加时,告诉索引库及时更新,此时activeMQ就充当了消息中间健的作用,当商品更新时,他就是消息生产者,通过activeMQ传达给消息消费者进行索引更新
solrcloud:solrcloud是solr提供的,基于solr和zookeeper的分布式搜索方案
应用场景 :1) 当需要大规模,容错,分布式索引和检索能力时使用solrcloud;
2)当索引量很大,搜索请求并发很高时,同样需要使用solrcloud来满足这些需求;
不过当一个系统的索引数据量少的时候不需要使用solrcloud;
zookeeper在solrcloud集群中作用:它的主要思想是使用zookeeper作为solrcloud集群的配置信息中心,同一管理solrcloud的配置,比如
solrConfig.xml和schema.xml;
它的几个特色功能:1)集中式的配置信息,2)自动容错3)近实时搜索4)查询时自动负载均衡
zookeeper的功能有很多,1)目录服务(注册中心) 2)配置中心
自己最solrcloud的理解:分为两个维度,物理维度:一个solrcloud集群由多个物理机器或者虚拟机组成,每个虚拟机中可以包含多个solrcore,一个solrcore对应一个solrhome,对应一个tomcat。
逻辑维度:一个solrcloud集群可以看成是一个collection,一个collection分为多个分片Shard,一个分 片又由多个solrcore组成,其中这几个solrcore是一主多从
不同的shard可以增强solrcloud的存储功能。同一个shard中不同的solrcore可以解决单点故障问题,以及可以解决高并发问题。
solrcloud中如何使用到了zookeeper:
1)、 solrcloud是通过zookeeper统一管理配置文件(solrconfig.xml、schema.xml等),所以搭建solrcloud之前,需要先搭建zookeeper。
2)、由于solrcloud一般都是解决大数据量、大并发的搜索服务,所以搭建solrcloud,对zookeeper也需要搭建集群。
一:zookeeper集群搭建:1):安装jdk ; 2).上传zookeeper-3.4.6.tar.gz到linux,解压,并重命名为zk1至/usr/local/solrclod中,在复制两份为zk2,zk3; 3)将zoo_example.cfg 重命名为zoo.cfg 4)修改zoo.cfg:如下:(三个zookeeper配置文件中的clientPort端口不相同)
5).在dataDir目录下创建myid文件(文件里面对应上面只写个1或者2或者3) 6).编写脚本,启动三台zookeeper
二.solrcloud搭建: 1).复制4个单机版solr服务对应的tomcat,并分别改变端口(每一个上面都有三个端口要改); 2)复制4个solrhome,每个solr实例对应一个solrhome 3).修改solrhome下的solr,xml文件(改一下ip和端口) 4).设置tomcat启动参数,在每个tomcat目录下的 bin/catalina.sh添加一下内容:JAVA_OPTS="-DzkHost=192.168.242.138:2281,192.168.242.138:2282,192.168.242.138:2283" 5).将solr文件中配置文件上传到zookeeper中,进行统一管理(使用/usr/local/solr-4.10.3/example/scripts/cloud-scripts下的zkcli.sh命令将/usr/local/solrcloud/solrhome8280/collection1/conf目录上传到zookeeper进行配置。):./zkcli.sh-zkhost192.168.242.139:2281,192.168.242.139:2282,192.168.242.139:2283-cmdupconfig -confdir /usr/local/solrcloud/solrhome8280/collection1/conf-confnamemyconf 6).使用zookeeper自带的 zkCli.sh命令连接zookeeper集群,查看上传的配置文件: ./zkCli.sh -server 192.168.242.138:2281 7)启动所有solr服务
三.创建collection:创建新的集群,名称为collection2,集群中有四个solr节点,将集群分为两片,每片两个副本: http://192.168.242.138:8280/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2 删除名称为collection1的集群: http://192.168.242.139:8280/solr/admin/collections?action=DELETE&name=collection1