Solr基础知识总结
Lucene站内搜索需要开发工作量大,主要表现在:索引维护、索引性能优化、搜索性能优化等
solr可以减少程序员工作量,并为搜索引擎提供完备解决方案,在门户、论坛等系统中常用。
solr是Apache下的一个顶级开源项目,采用java开发,可独立运行,运行在jetty、Tomcat等servlet容器中
POST进行增删改,GET进行查询
安装和配置
服务启动:solr.cmd start
服务关闭:solr.cmd stop -all
创建core:solr create corename
创建Collection:solr create -c collectionname
删除core:solr delete corename
删除Collection:solr delete collectionname
post命令:用于导入数据的命令行工具,支持JSON,XML和CSV格式
./bin/post -c films example/films/films.json
目录介绍
bin 包含几个重要脚本,使solr更简单
solr和solr.cmd 是Solr的控制脚本,是启动和停止solr的首选工具
post提供便于发布内容的命令行接口工具,支持JSON、XML和CSV,也可以导入html、pdf、microsoft office、纯文本等
solr.in.sh和solr.in.cmd用于配置服务安装到系统中
contrib Solr和cpmrtib包含Solr专用功能和附加插件
dist包含主要jar包
docs包含连接到在线的solr文档
example包含演示各种Solr功能的示例
exampledocs是一系列简单的CSV、XML、JSON文件,可以bin/post在首次使用Solr时使用
example-DIH包含一些DataImport Handler示例,可以帮助在数据库、电子邮件服务器及Atom中导入结构化内容
files该目录为本地存储文档word、pdf等提供基本搜索UI
films包含一组关于电影的强大数据,包扩三种格式:CSV、XML和JSON
license包含Solr使用第三方库的所有许可证
service是solr的核心所在
基本概念
solr.home
默认:solr-7.1.0/server/solr
solr在运行时需要访问主目录solr.home
主目录包含重要配置信息,并且是solr将存储其索引的地方
文件说明:
solr.xml为solr服务器实例指定配置选项
core_name 核心目录
core.properties 为每个核心定义特定的属性
conf 在solrCloud中没有
solrconfig.xml 控制高级行为
managed-schema 描述solr索引文档
data 包含底层索引文件的目录
schema 模式
包含Field、dynamicField、copyField、FieldType的定义
配置文件为managed-schema
Schemaless Mode
无模式模式是一组solr功能,在一起使用时只需要索引数据即可快速构建schema,无需动手编写
功能都是通过solrconfig.xml文件控制,建议关闭schemaless mode模式,若字段类型不正确,不能正确查询
Field 字段
字段属性说明:
name: 必须属性 字段名
type: 不许属性 字段类型
indexed: 索引有无,有为true,无为false
stored: 返回有无,有为true,无为false
multiValued: 是否包含多个值,若多个为true,单个为false
required:字段必须有值,否则抛出异常
default:增加文档时为字段设置默认值,防止为空
termVectors:使用MoreLikeThis进行相似度判断,需要设置相关字段为stored
termPositions:保存和向量相关的位置信息,会增加存储开销
termOffsets:保存offset和向量相关的信息,会增加存储开销
douValues:若字段具有文档值,设置为true。文档值在门面搜索、分组、排序和函数查询中会很有用
性能优化:
- 尽量将所有仅用于搜索,不用于实际返回的字段设置stored=“false”
- 尽量将所有仅用于返回,不用于搜索的字段设置为indexed=“false”
- 去掉所有不需要的copyField
- 为了达到最佳索引大小和搜索性能,将所有文本的字段设置indexed=“false”,使用copyFiled将他们拷贝到整合字段name="text"中,使用整合字段进行搜索
- 使用server模式运行JVM,同时将log级别调高,避免输出所有请求日志
dynamicField 动态字段
动态字段允许solr索引没有在schema中明确定义的字段。在忘记定义一些字段时很有用,可以让系统更灵活,通用性更强。
动态字段和常规字段类似,除了它名字包含一个通配符外,在索引文档时,若一个字段常规字段中未匹配,则会在动态字段中进行匹配
*_i动态字段,若索引一个cost_i的字段时,该字段不存在会检索*_i
动态字段也是定义在schema.xml中,和其他字段一样,有名词、字段类型、属性
copyField 复制字段
典型场景:若要查询包含java的博客,要查询标题和内容,不能像sql语句那样where tittle like ‘%Java%’ or content like ‘%Java%’,此时定义一个新字段,将title和content复制到该字段,索引时,直接从这个新字段开始查询
注意:若dest由多个source构成,需要制定为multiValued
configSet 配置集目录
当使用solr create命令创建Core或者Collection时,需要使用-d命令制定使用什么配置创建Core或者Collection,若不指定,则默认使用
server/solr/configsets/_default作为Core和Collection配置
默认查询字段-text字段
当我们在查询字段时,如果没有指定字段查询,则使用默认字段text查询
为达到最忌索引大小和搜索性能,对所有文本字段设置"indexed=false",使用copyField将他们拷到整合字段"name=text"字段中,使用整合字段搜索
facet 高级查询
Facet可以为用户提供更友好的搜索体验,在搜索关键词的同时,能够按照Facet的字段进行分组并统计
注意:facet.field指定的字段必须是可indexed的,否则无法查询
版本更新注意
在Solr5以后,schema文件已经不是默认生成好的了,它被取了一个名字managed-schema,并且没有后缀
schema.xml会影响导入之后的query,只显示id和version,可以将其转换为managed-schema即可
增删改查
添加修改
{"id":"1",.....}
删除
<delete>
<query>id:7</query>
</delete>
<commit/>
查询
q - 查询字符串,必须的,如果查询所有使用*:*
fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的
sort - 排序
start - 分页显示使用,开始记录下标,从0开始
rows - 指定返回结果最多有多少条记录,配合start来实现分页
fl - 指定返回那些字段内容,用逗号或空格分隔多个
df-指定一个搜索Field
wt - (writer type)指定输出格式,可以有 xml, json, php, phps
hl 是否高亮 ,设置高亮Field,设置格式前缀和后缀
java查询时特殊字符转义处理
/**
* 转义特殊字符
* @param input
* @return
*/
public String transformMetachar(String input){
StringBuffer sb = new StringBuffer();
try{
String regex = "[+\\-&|!(){}\\[\\]^\"~*?:(\\)\\s]";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while(matcher.find()){
matcher.appendReplacement(sb, "\\\\"+matcher.group());
}
matcher.appendTail(sb);
} catch(Exception e){
//TODO
}
return sb.toString();
}
总结
本文主要是记录了初学solr时的一些笔记,未深入进行探究,后续会有文章进行研究。