【Solr】
主要内容
- Solr简介
- Solr搜索原理
- Solr单机版安装
- 可视化管理界面
- 新建核心
- 分词
- Dataimport
- 使用SolrJ操作Solr
- SolrCloud
学习目标
知识点 要求
Solr简介 掌握
Solr搜索原理 掌握
Solr单机版安装 掌握
可视化管理界面 掌握
新建核心 掌握
分词 掌握
Dataimport 掌握
使用SolrJ操作Solr 掌握
SolrCloud 掌握
Spring Data for Apache Solr 掌握
一、 Solr简介
1 为什么使用Solr
在海量数据下,对MySQL或Oracle进行模糊查询或条件查询的效率是很低的。而搜索功能在绝大多数项目中都是必须的,如何提升搜索效率是很多互联网项目必须要考虑的问题。
既然使用关系型数据库进行搜索效率比较低,最直接的解决方案就是使用专用搜索工具进行搜索,从而提升搜索效率。
2 常见搜索解决方案
基于Apache Lucene(全文检索工具库)实现搜索。但是Lucene的使用对于绝大多数的程序员都是“噩梦级”的。
基于谷歌API实现搜索。
基于百度API实现搜索。
3 Solr简介
Solr是基于Apache Lucene构建的用于搜索和分析的开源解决方案。可提供可扩展索引、搜索功能、高亮显示和文字解析功能。
Solr本质就是一个Java web 项目,且内嵌了Jetty服务器,所以安装起来非常方便。客户端操作Solr的过程和平时我们所写项目一样,就是请求Solr主控制器,处理完数据后把结果响应给客户端。
4 正向索引和反向索引
只要讨论搜索就不得不提的两个概念:正向索引(forward index)和反向索引(inverted index)。
正向索引:从文档内容到词组的过程。每次搜索的实收需要搜索所有文档,每个文档比较搜索条件和词组。
文档 词组
I am a chinese I,am,a,chinses
反向索引:是正向索引的逆向。建立词组和文档的映射关系。通过找到词组就能找到文档内容。(和新华字典找字很像)
词组 文档
I,am,a,chinses I am a chinese
二、 Solr搜索原理
1 搜索原理
Solr能够提升检索效率的主要原因就是分词和索引(反向索引,通过)。
分词:会对搜索条件/存储内容进行分词,分成日常所使用的词语。
索引:存储在Solr中内容会按照程序员的要求来是否建立索引。如果要求建立索引会把存储内容中关键字(分词)建立索引。
2 Solr中数据存储说明
Solr为了给内容建立索引,所以Solr就必须具备数据存储能力。所有需要被搜索的内容都需要存储在Solr中,在开发中需要把数据库中数据添加到Solr中进行初始化,每次修改数据库中数据还需要同步Solr中的数据。
Solr中数据存储是存储在Document对象中,对象中可以包含的属性和属性类型都定义在scheme.xml中。如果需要自定义属性或自定义属性类型都需要修改scheme.xml配置文件。从Solr5开始schema.xml更改名称为managed-scheme(没有扩展名)
三、 Solr单机版安装
Solr是使用Java编写,所以必选先安装JDK。
1 上传并解压
上传压缩包solr-8.2.0.tgz到/usr/local/tmp中。
解压
cd /usr/local/tmp
tar zxf solr-8.2.0.tgz
2 复制到/usr/local中
cp -r solr-8.2.0 …/solr
3 修改启动参数
修改启动参数,否则启动时报警告。提示设置SOLR_ULIMIT_CHECKS=false
cd /usr/local/solr/bin
vim solr.in.sh
4 启动Solr
Solr内嵌Jetty,直接启动即可。监听8983端口。
solr默认不推荐root账户启动,如果是root账户启动需要添加-force参数。
./solr start -force
四、 可视化管理界面
在关闭防火墙的前提下,可以在windows的浏览器中访问Solr管理页面。
输入: http://192.168.0.105:8983 就可以访问Solr的可视化管理界面。
左侧有5个菜单。分别是:
(1)Dashboard:面板显示Solr的总体信息。
(2)Logging:日志
(3)Core Admin:Solr的核心。类似于数据的Database
(4)Java Perperties:所有Java相关属性。
(5)Thread Dump:线程相关信息。
(6)如果有Core,将显示在此处。
4.1 Solr管理页面操作
4.1.1 Dashboard(仪表盘)
访问http://localhost:8080/solr时,出现该主页面,可查看到solr运行时间、solr版本,系统内存、虚拟机内存的使用情况
4.1.2 Logging(日志)
显示solr运行出现的异常或错误
4.1.3 Core Admin (core管理)
主要有Add Core(添加核心), Unload(卸载核心),Rename(重命名核心),Reload(重新加载核心),Optimize(优化索引库)
name:给core起的名字;
instanceDir:与我们在配置solr到tomcat里时的solr_home里新建的core文件夹名一致;
dataDir:确认Add Core时,会在new_core目录下生成名为data的文件夹
config:new_core下的conf下的config配置文件(solrconfig.xml)
schema: new_core下的conf下的schema文件(schema.xml)
4.1.4 Java Properties
可查看到java相关的一些属性的信息
4.1.5 Thread Dump
查看每个线程的详细信息,以及状态信息
4.1.6 Core Selecter(core选择器)
4.1.6.1 overview(概览)
包含基本统计如当前文档数;和实例信息如当前核心的配置目录
4.1.6.2 Analysis(分析)
检验分词效果
4.1.6.3 Dataimport(导入数据)
4.1.6.4 Documents
Documents (索引文档)索引的相关操作,如:增加,修改,删除等
在如下页面,选择/update ,文档格式选择json ,然后submit 提交。这样 索引就增加上了。修改与增加一样,都是/update ,删除为/delete 。 成功之后,我们去query里查询数据就能查到我们刚添加的数据.
4.1.6.5 Files文件夹
solr_home下的core下的conf下的相关文件,可单击查看里面的内容
4.1.6.6 Ping
查看当前核心库还是否工作的以及响应时间
4.1.6.7 Plugins /stats
Solr自带的一些插件以及我们安装的插件的信息以及统计
4.1.6.8 Query(查询页面)
查询的结果要显示哪个字段,就得将schema.xml文件配置字段时的stored属性设为true
Request-Handler(qt): 请求处理器
q: 查询字符串(必须的)。:表示查询所有;keyword:尚学堂 表示按关键字“尚学堂”查询
fq: filter query 过滤查询。作用:在q查询符合结果中同时是fq查询符合的(类似求交集),例如:q=mm&fq=date_time:[20081001 TO 20091031],找关键字mm,并且date_time是20081001到20091031之间的。
sort: 排序。格式如下:字段名 排序方式;如id desc 表示按id字段降序排列查询结果。
start,rows:表示查回结果从第几条数据开始显示,共显示多少条。
fl: field list。指定查询结果返回哪些字段。多个时以空格“ ”或逗号“,”分隔。不指定时,默认全返回。
df: default field默认的查询字段,一般默认指定。
Raw Query Parameters: 原始查询参数的
wt: write type。指定查询输出结果格式,我们常用的有json格式与xml格式。在solrconfig.xml中定义了查询输出格式:xml、json、python、ruby、php、csv。
indent: 返回的结果是否缩进,默认关闭,用 indent=true | on 开启,一般调试json,php,phps,ruby输出才有必要用这个参数。
debugQuery: 设置返回结果是否显示Debug信息。
dismax:
edismax:
hl: high light 高亮。hl=true表示启用高亮
hl.fl : 用空格或逗号隔开的字段列表(指定高亮的字段)。要启用某个字段的highlight功能,就得保证该字段在schema中是stored。
hl.simple.pre: 设置高亮显示的html标记的开始标记
hl.simple.post:设置高亮显示的html标记的结束标记
hl.requireFieldMatch: 如果置为true,除非该字段的查询结果不为空才会被高亮。它的默认值是false,意味 着它可能匹配某个字段却高亮一个不同的字段。如果hl.fl使用了通配符,那么就要启用该参数。尽管如此,如果你的查询是all字段(可能是使用 copy-field 指令),那么还是把它设为false,这样搜索结果能表明哪个字段的查询文本未被找到
hl.usePhraseHighlighter:如果一个查询中含有短语(引号框起来的)那么会保证一定要完全匹配短语的才会被高亮。
hl.highlightMultiTerm:如果使用通配符和模糊搜索,那么会确保与通配符匹配的term会高亮。默认为false,同时hl.usePhraseHighlighter要为true。
facet:分组统计,在搜索关键字的同时,能够按照Facet的字段进行分组并统计。
facet.query:Facet Query利用类似于filter query的语法提供了更为灵活的Facet.通过facet.query参数,可以对任意字段进行筛选。
facet.field:需要分组统计的字段,可以多个。
facet.prefix: 表示Facet字段值的前缀。比如facet.field=cpu&facet.prefix=Intel,那么对cpu字段进行Facet查询,返回的cpu都是以Intel开头的, AMD开头的cpu型号将不会被统计在内。
spatial:
spellcheck: 拼写检查。
4.1.6.9 Replication
显示你当前Core的副本,并提供disable/enable功能
4.1.6.10 Schema
展示该Core的shema.xml文件中的内容
五、 新建核心
Solr安装完成后默认是没有核心的。需要手动配置。
需要在solr/server/solr下新建文件夹,并给定配置文件,否则无法建立。
1 新建目录
在/usr/local/solr/server/solr中新建自定义名称目录。此处示例名称为testcore。
cd /usr/local/solr/server/solr
mkdir testcore
2 复制配置文件
在configsets里面包含了_default和sample_techproducts_configs。里面都是配置文件示例。_default属于默认配置,较纯净。sample_techproducts_configs是带有了一些配置示例。
cp -r configsets/_default/conf/ testcore/
3 填写Core信息
在可视化管理界面中Core Admin中编写信息后点击Add Core后,短暂延迟后testcore就会创建成功。schema处不用更改。
4 出现testcore
在客户端管理界面中,选择新建的Core后,就可以按照自己项目的需求进行操作了。
六、 分词Analysis
在Solr可视化管理界面中,Core的管理菜单项中都会有Analysis。表示根据Scheme.xml(managed-schema)中配置要求进行解析。
对英文解析就比较简单了,只要按照空格把英文语句拆分成英文单词即可。
但是如果条件是中文时,把一句话按照字进行拆分就不是很合理了。正确的方式是按照合理的词组进行拆分。
1 配置步骤
上传ik-analyzer.jar到webapps中。
去https://search.maven.org/search?q=com.github.magese下载对应版本的ik-analyzer。可以在01资料/02 Analyzer中直接获取。
1.1 上传jar到指定目录
上传ik-analyzer-8.2.0.jar到
/usr/local/solr/server/solr-webapp/webapp/WEB-INF/lib目录中
1.2 修改配置文件
修改/usr/local/solr/server/solr/testcore/conf/managed-schema
vim /usr/local/solr/server/solr/testcore/conf/managed-schema
添加下面内容。
排版:Esc 退出编辑状态下:gg=G
1.3 重启
cd /usr/local/solr/bin
./solr stop -all
./solr start -force
重启的第二种方式
./solr restart -force
1.4 验证
可以在可视化管理界面中找到myfield属性进行验证。
2 managed-schema配置说明
2.1
表示定义一个属性类型。在Solr中属性类型都是自定义的。在上面配置中name=”text_ik”为自定义类型。当某个属性取值为text_ik时IK Analyzer才能生效。
2.2
表示向Document中添加一个属性。
常用属性:
name: 属性名
type:属性类型。所有类型都是solr使用配置的
indexed: 是否建立索引
stored: solr是否把该属性值响应给搜索用户。
required:该属性是否是必须的。默认id是必须的。
multiValued:如果为true,表示该属性为复合属性,此属性中包含了多个其他的属性。常用在多个列作为搜索条件时,把这些列定义定义成一个新的复合属性,通过搜索一个复合属性就可以实现搜索多个列。当设置为true时与结合使用
2.3
唯一主键,Solr中默认定义id属性为唯一主键。ID的值是不允许重复的。
2.4
名称中允许*进行通配。代表满足特定名称要求的一组属性。
复制域。可实现更新与查询分离
Source:源域
Dest:目标域
七、 Dataimport
可以使用Solr自带的Dataimport功能把数据库中数据快速导入到solr中.
必须保证managed-schema和数据库中表的列对应。
1 修改配置文件
修改solrconfig.xml,添加下面内容
2 新建data-config.xml
和solrconfig.xml同一目录下新建data-config.xml
3 添加jar
向solr-webapp中添加三个jar。在dist中两个还有一个数据库驱动。
4 操作
重启solr后,在可视化管理页面中进行数据导入。
注意:
点击导入按钮后,要记得点击刷新按钮。
八、 菜单项目Documents使用办法
以XML格式举例
1 新增/修改
当id不存在时新增,当id存在修改。
8
明天更大卖
98
2 删除
2.1 根据主键删除
8
2.2 根据条件删除
:
九、 使用SolrJ操作Solr
SolrJ是Solr提供的Java客户端API。通过SolrJ可以实现Java程序对Solr中数据的操作。
大前提:添加SolrJ依赖。依赖版本和Solr版本严格对应
org.apache.solr
solr-solrj
8.2.0
1 新增/修改实现
String url = “http://192.168.0.105:8983/solr/testcore”;
HttpSolrClient solrClient = new HttpSolrClient.Builder(url).build();
SolrInputDocument inputDocument = new SolrInputDocument();
inputDocument.addField(“id”,“3”);
inputDocument.addField(“myfield”,“myfield3”);
solrClient.add(inputDocument);
solrClient.commit();
2 删除实现
String url = “http://192.168.0.105:8983/solr/testcore”;
HttpSolrClient solrClient = new HttpSolrClient.Builder(url).build();
solrClient.deleteById(“3”);
solrClient.commit();
3 查询实现
public void testQuery(){
try {
String url = “http://192.168.0.105:8983/solr/testcore”;
HttpSolrClient solrClient = new HttpSolrClient.Builder(url).build();
//封装了所有查询条件
SolrQuery params = new SolrQuery();
params.setQuery("name:oldlu");
//排序
params.setSort("age", SolrQuery.ORDER.desc);
//分页
params.setStart(0);
params.setRows(1);
//高亮
params.setHighlight(true);
params.addHighlightField("name");
params.setHighlightSimplePre("<span>");
params.setHighlightSimplePost("</span>");
QueryResponse response = solrClient.query(params);
SolrDocumentList list = response.getResults();
System.out.println("总条数:"+list.getNumFound());
//高亮数据
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
for(SolrDocument doc :list){
System.out.println(doc.get("id"));
Map<String, List<String>> map = highlighting.get(doc.get("id"));
List<String> HLList = map.get("name");
if(HLList!=null&&HLList.size()>0){//显示高亮数据
System.out.println(HLList.get(0));
}else{
System.out.println(doc.get("name"));
}
System.out.println(doc.get("age"));
System.out.println("===================");
}
solrClient.close();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
十、 SolrCloud
Solr可以搭建具备容错能力和高可用的Solr集群。集群中集群配置、自动负载均衡和查询故障转移、Zookeeper集群实现集群协调管理,这些全部功能统称为SolrCloud。
SolrCloud是基于Zookeeper进行管理的。在Solr中已经内置了Zookeeper相关内容,当执行集群创建命令会自动创建Zookeeper相关内容。这个使用的是Zookeeper的集群管理功能实现的。
1 搭建
1.1 创建
SolrCloud已经包含在了Solr中,可以直接启动Solr集群。
./solr -e cloud -noprompt -force
此命令等同于# ./solr -e cloud -force全部参数为默认值。
运行成功后会在example文件夹多出cloud文件夹。
1.2 停止
./solr stop -all
1.3 重新运行
./solr start -c -p 8983 -s …/example/cloud/node1/solr/ -force
#./solr start -c -p 7574 -z localhost:9983 -s …/example/cloud/node2/solr/ -force