Solr基础

1.1 目录结构

		/bin	运行文件
		/contrib	插件
		/dist	相关运行jar包
		/docs	相关API文档
		/example	配置样例
		/licenses	相关证书
		/server	Solr运行核心文件

1.2 常用命令(单节点)

	solr start -p 8983	 启动端口8983的solr服务
	solr restart -p 8983	 重启
	solr stop -p 8983	 停止
	solr create -c core1	 添加core1

1.3 安装配置Solr(基础)

1.3.1 core: solr中的实例

两种配置方式:
	a.使用命令:solr create -c name xxx
	b.Solr的可视化界面中,点击添加。

1.3.2 schema:定义solr索引生成的方式

老版本配置schema,用schema.xml文件,现在使用managed-schema。即利用schemaAPI修改managed-schema。
(原因: schema.xml需要重启solr,使配置文件生效。使用schemaAPI可以自动加载新的配置内容。)

Schema配置文件详解:
	标签名称	注解
	fieldType	为field定义类型,主要是定义分词器。
	analyzer	分词器,由tokenizer和filter组成
	field	定义创建索引用的字段。
	属性indexed=true:利用当前字段创建索引。
	属性stored=true:表示存储索引
	
官网Schema API:http://lucene.apache.org/solr/guide/7_4/schema-api.html
http请求配置manage-schema的API很多,要自己去实践记忆。

1.3.3 中文分词器

Analyzer:定义如何检索关键字。原生的SmartChanieseAnalyzer扩展性比较差,不能扩展中文词库。采用三方中文分词器:IKAnalyzer。
中文分词器配置方式:
1.核心jar包放在 \solr-7.4.0\server\solr-webapp\webapp\libs下。
2.词库和其他配置文件放在 \solr-7.4.0\server\solr-webapp\webapp\classes下。
3.Schema配置如下:
    如果想要扩展词库可以在ext.dic文件中配置自定义的中文词组,例如:诛仙这个词组,这个分词器的算法是算不出来的但是通过我们自定义词库,分词器也可以把诛仙列出关键词。注意编辑此文件时字符编码最好是UTF-8无BOM模式,这个可以通过EditPlus等文本编辑工具设置。
manage-schema文件添加:
<!-- IK分词 -->
<fieldType name="text_ik" class="solr.TextField">
	<analyzer type="index">
	   <tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="false"/>
	</analyzer>
	<analyzer type="query">
	    <tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="false"/>
	</analyzer>
</fieldType>
理论上:使用SchemaAPI也可以添加fieldType。但在测试的时候,提示analyzer是一个object不可以是数组。注意
后期再试一下吧。

1.3.4 DIH(Data Import Handler)

主要:将关系型数据库数据导入(参照:solr-7.4.0\example\example-DIH\solr\db\conf下文件)
1.理解:既然导入,那肯定在solr实例中。换句话说,要先创建新的core。
2.配置数据导入文件的映射位置:solrconfig.xml中。
3.配置数据映射文件:dataconfig.xml
(1)首先配置数据源关系型数据库基本四项,驱动类,url,用户名,密码。
(2)配置document,可以把它当作与mysql中数据库一个层级的对象。
(3)配置entity,可以把它当作与数据库中一个表对应,在query中书写查询sql。
(4)配置field与表中的字段与之对应。
4. 在managed-schema文件中,将field字段添入。
   <field name="shuceid" type="string" indexed="true" stored="true"/>
   <field name="sshid" type="string" indexed="true" stored="true"/>
   <field name="ydsmid" type="string" indexed="true" stored="true"/>
   <field name="yssmid" type="string" indexed="true" stored="true"/>
   <field name="czid0" type="string" indexed="true" stored="true"/>

   <fieldType name="int" class="solr.TrieIntField" docValues="true" precisionStep="0" positionIncrementGap="0"/>
   <fieldType name="long" class="solr.TrieLongField" docValues="true" precisionStep="0" positionIncrementGap="0"/>
   <fieldType name="date" class="solr.TrieDateField" docValues="true" precisionStep="0" positionIncrementGap="0"/>
   <fieldType name="float" class="solr.TrieFloatField" docValues="true" precisionStep="0" positionIncrementGap="0"/>

&:solr-dataimporthandler.jar包默认在solr-7.4.0\dist下,要放入webapps\libs下。(也可以直接将dist下的jar包直接全部放入libs下。)

1.3.5 solr的配置常见配置文件

Solr的三个常用配置文件:
	1>manager-schema:solr的核心配置文件,用来定义索引的生成策略。
	2>solrconfig.xml:主要定义了solr的一些处理规则,包括索引数据的存放位置,更新,删除,查询的一些规则配置。相当于是基础配置文件。(Handler处理文件)
	3>Dataconfig.xml:配置数据连接信息,以及一些添加、更新的具体sql操作。
&相关博客:https://blog.csdn.net/vtopqx/article/details/73224510 

manager-schema配置文件详解(重点)
1.认识:Solr基础架构:field->document->lucene->solr。
2.<field>
a.index:是否创建索引
b.stored:是否存储
c.type:配置中fieldType,用来指定field的类型
d.name:用来索引的字段名称
e.required:是否必填
f.multiValued:是否多值,一般用在聚合查询
3.<dynamicField>
    与<field>标签不同的是,name的值是带通配符的。eg:*_p、*_a
4.<copyField>
    可以将多个字段整合在一起,匹配这个字段的同时,也会将包含的字段匹配
5.<fieldType>
    自定field类型,做一下额外的处理:是否分词,查询前后的拦截器处理
6.<unionKey>
    相当于DB中主键

查询页面相关参数及含义
详情博客:https://www.cnblogs.com/zhangweizhong/p/5056884.html
一.基本查询
q	查询的关键字,此参数最为重要,例如,q=id:1,默认为q=*:*
fq	(filter query)过虑查询,提供一个可选的筛选器查询。返回在q查询符合结果中同时符合的fq条件的查询结果,例如:q=id:1&fq=sort:[1 TO 5],找关键字id为1 的,并且sort是1到5之间的。
fl	指定返回哪些字段,用逗号或空格分隔,注意:字段区分大小写,例如,fl= id,title,sort
start	返回结果的第几条记录开始,一般分页用,默认0开始
rows	指定返回结果最多有多少条记录,默认值为 10,配合start实现分页
sort	排序方式,例如id  desc 表示按照 “id” 降序
wt	(writer type)指定输出格式,有 xml, json, php等
df	默认的查询字段,一般默认指定。
qt	(query type)指定那个类型来处理查询请求,一般不用指定,默认是standard。
indent	返回的结果是否缩进,默认关闭,用 indent=true|on 开启,一般调试json,php,phps,ruby输出才有必要用这个参数。
version	查询语法的版本,建议不使用它,由服务器指定默认值。

二. Solr的检索运算符
“:”	指定字段查指定值,如返回所有值*:*
“?”	表示单个任意字符的通配
“*”	表示多个任意字符的通配(不能在检索的项开始使用*或者?符号)
“~”	表示模糊检索,如检索拼写类似于”roam”的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回相似度在0.8以上的记录。
AND、&&	布尔操作符
OR、||	布尔操作符
NOT、!、-	排除操作符不能单独与项使用构成查询
“+”	存在操作符,要求符号”+”后的项必须在文档相应的域中存在
( )	用于构成子查询
[]	包含范围检索,如检索某时间段记录,包含头尾,date:[201507 TO 201510]
{}	不包含范围检索,如检索某时间段记录,不包含头尾,date:{201507 TO 201510}

三. 高亮
  hl  是否高亮,hl=true,表示采用高亮
  hl.fl  设定高亮显示的字段,用空格或逗号隔开的字段列表。要启用某个字段的highlight功能,就得保证该字段在schema中是stored。如果该参数未被给出,那么就会高亮默认字段 standard handler会用df参数,dismax字段用qf参数。你可以使用星号去方便的高亮所有字段。如果你使用了通配符,那么要考虑启用hl.requiredFieldMatch选项。
  hl.requireFieldMatch   如果置为true,除非用hl.fl指定了该字段,查询结果才会被高亮。它的默认值是false。
  hl.usePhraseHighlighter   如果一个查询中含有短语(引号框起来的)那么会保证一定要完全匹配短语的才会被高亮。
  hl.highlightMultiTerm   如果使用通配符和模糊搜索,那么会确保与通配符匹配的term会高亮。默认为false,同时hl.usePhraseHighlighter要为true。
hl.fragsize   返回的最大字符数。默认是100.如果为0,那么该字段不会被fragmented且整个字段的值会被返回。

四. 分组
  官方wiki:http://wiki.apache.org/solr/SimpleFacetParameters#Facet_Fields_and_Facet_Queries,
  这是facet的官方wiki,里面有facet各个参数的详细说明。所以这里只说一些常用的。
  Facet是Solr的核心搜索功能,主要是导航(Guided Navigation)、参数化查询(Paramatic Search)。Facet的主要好处是在搜索的同时,可以按照Facet条件进行分组统计,给出导航信息,改善搜索体验。
Facet主要分为:Field Facet 和  Date Facet 两大类
1. Field Facet     
facet 参数字段必须被索引 
facet=on facet=true
facet.field	分组的字段
facet.prefix	表示Facet字段前缀
facet.limit	Facet字段返回条数
facet.offict	偏移量,它与facet.limit配合使用可以达到分页的效果
facet.mincount	Facet字段最小count,默认为0
facet.missing	如果为on或true,那么将统计那些Facet字段值为null的记录
facet.sort	表示 Facet 字段值以哪种顺序返回 .格式为 true(count)|false(index,lex),true(count) 表示按照 count 值从大到小排列,false(index,lex) 表示按照字段值的自然顺序 (字母 , 数字的顺序 ) 排列 . 默认情况下为 true(count)

2. Date Facet
对日期类型的字段进行 Facet.  Solr 为日期字段提供了更为方便的查询统计方式 .注意 , Date Facet的字段类型必须是 DateField( 或其子类型 ). 需要注意的是 , 使用 Date Facet 时 , 字段名 , 起始时间 , 结束时间 , 时间间隔这 4 个参数都必须提供 .
facet.date	该参数表示需要进行 Date Facet 的字段名 , 与 facet.field 一样 , 该参数可以被设置多次 , 表示对多个字段进行 Date Facet.
facet.date.start	起始时间 , 时间的一般格式为 ” 2015-12-31T23:59:59Z”, 另外可以使用 ”NOW”,”YEAR”,”MONTH” 等等 
facet.date.end 	结束时间
facet.date.gap	时间间隔,如果 start 为 2015-1-1,end 为 2016-1-1,gap 设置为 ”+1MONTH” 表示间隔1 个月 , 那么将会把这段时间划分为 12 个间隔段
facet.date.hardend	 表示 gap 迭代到 end 时,还剩余的一部分时间段,是否继续去下一个间隔. 取值可以为 true|false, 默认为 false
eg:start 为 2015-1-1,end 为 2015-12-21,gap 为 ”+1MONTH”, 如果hardend 为 false,则,最后一个时间段为 2015-12-1 至 2016-1-1; 反之,如果 hardend 为 true,则,最后一个时间段为 2015-12-1 至 2015-12-21.

  注意:Facet的字段必须被索引,无需分词,无需存储。无需分词是因为该字段的值代表了一个整体概念,无需
  存储是因为一般而言用户所关心的并不是该字段的具体值,而是作为对查询结果进行分组的一种手段,给出相关
  的分组信息,从而改善搜索体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值