文章目录
solr使用五(solr命令合集)
将完全使用命令行完整演示solr的整个使用过程
场景设计
启动solr->创建Core->在core中添加Field->添加数据->修改数据->查询数据->删除数据->删除Core->关闭solr
启动
# 方式一: 直接启动
solr start
# 方式二: 进入solr的安装目录,指定solr的启动端口
cd /usr/local/Cellar/solr/8.5.0/bin
# 忘记solr的启动参数含义,使用help命令查看
./solr start -help
# 根据提示,启动本地solr
./solr start -h localhost -p 8983
创建core
创建一个名字为person的core
./solr create_core -c person
添加Field
person这个core,主要存储Person对象的一些属性
@Getter
@Setter
@ToString
public class Person {
private long userId;
private String userName;
/*
* user信息,超大文本
*/
private String userInfo;
private Integer age;
private Date created;
}
请求路径为
solr的ip:port/solr/core的名字/schema
-
使用curl方式进行add-field,
-H 代表Header,请求头
-d代表–data-binary,表示json格式
curl -X POST -H 'Content-Type:application/json' -d '{
"add-field":{
"name":"userId",
"type":"string",
"indexed":true,
"stored":true
}
}' http://localhost:8983/solr/person/schema
添加多个field如下,即使用数组即可.如果是一个字段有多个值,设置multiValued为true即可
curl -X POST -H 'Content-type:application/json' --data-binary '{
"add-field":[
{ "name":"shelf",
"type":"myNewTxtField",
"stored":true,
"multiValued":true },
{ "name":"location",
"type":"myNewTxtField",
"stored":true }]
}' http://localhost:8983/solr/gettingstarted/schema
- 同理可以使用postman请求
注意:由于solr中的数据的唯一键默认值是id,我们需要更改为我们自定义的useId,但是通过curl的方式又更改不了,只能手动去修改managed-schema文件的uniqueKey,并把id注注释掉。
向Core中添加数据
solr的ip:port/solr/core的名字/update?commit=true
- 使用curl方式添加一般的filed
curl -X POST -H 'Content-Type:application/json' 'http://localhost:8983/solr/person/update?commit=true' -d '[{"userId":"1284470706704240642","userName":"onePer","age":14,"userInfo":"应用场景:我们在搜索时 比如输入java,一篇文章分为标题、简介、内容等很多字段,输入的关键字需要制定solr中的域进行检索,不可能从一个表中将所有字段进行索引,因为有些字段不需要索引,所以出现copyField域,把多个域的关键词复制到同一个域,多个域时,可以放到一个域中。就不用定义那么多域了。搜索比较方便","created":"2020-07-19 10:57:12"}]'
注意:这里为什么curl最后面的url要用单引号包起来?而上面的addField却没有,这是因为这次的URL中多了一些参数,并且多了特殊字符=,必须要对这些特殊字符进行转义才可以正常发送数据,使用单引号即可防止=被转义、URL中的特殊字符还有?,&等,有兴趣的可以自己了解下。
同时这里要指明头是json类型,如果不指明,则curl默认的头是application/x-www-form-urlencoded,这点可以通过在curl的时候加上-iv参数,可以看到。更多关于curl的知识可以参考curl官网或者这篇文章和这里
- 使用curl添加具有multiValued属性的数据.格式为 属性:[ 这里面是具体的多个值]
curl -X POST -H 'Content-Type:application/json' -d '[{"name":"名字","content":["this is first","this is second","this is third"]}]' 'http://localhost:8983/solr/article/update?commit=true'
- 使用postman
注意:无论是curl还是postman,请求时,json数据都是以数组格式请求的。也就是说,可以批量插入数据
修改数据
curl方式
curl -X POST -H 'Content-Type' 'http://localhost:8983/solr/person/update?commit=true' -d '[{"userId":"1284470706704240648","userName":"twoPer modify","age":78,"created":"2009-08-23 11:12:25"}]'
查询数据
普通查询
curl get方式
curl -X GET 'http://localhost:8983/solr/person/query?q=userName:four*'
分页查询
分页查询则直接url拼接参数start、rows。例如:start=0&rows=20
curl -X GET 'http://localhost:8983/solr/person/query?q=userName:four*&start=0&rows=20'
curl post方式, 查询 age小于等于13,
数据范围查询
- * TO 13代表无下限到13之间,
- []代表包括
- 如果是{},则不包括13
curl -X POST -H 'Content-Type:application/json' 'http://localhost:8983/solr/person/query' -d '{"query":"age: [* TO 13]"}'
如果要分页,则curl的url后面页直接拼接start、rows即可
在浏览器直接请求,查询age 大于等于13的数据
条件查询
bool条件查询。满足userName是sixPer的数据,才被查询出来
url -X POST -H 'Content-Type:application/json' 'http://localhost:8983/solr/person/query' -d '{"query":{"bool":{"must":["userName:sixPer"]}}}'
范围查询
以name:(haha 我的) ,用()包裹,多个值之前用空格隔开
curl -H 'ContentType:application/json' 'http://localhost:8983/solr/cutomData/query' -d '{"query":"name:(我的 haha)"}'
词组查询
以双引号""包裹起来
平时查询,例如:查询content中包含【老歌】这个词组的数据,如果不加双引号,solr会默认认为这是两个独立的字,则只要包含老和歌二字的都会查出来。这样的结果显然不满足我们的要求。所以使用词组查询。词组查询的基础教程见官方文档
同时solr也提供了针对字词搜索的加强。edismax了解一下?
curl -H 'ContentType:application/json' "http://localhost:8983/solr/cutomData/query" -d '{"query":"content":"老歌"}'
空间查询
solr针对空间位置、地理信息搜索的支持
这一部分,没有做过多的了解。因为平时工作内容不涉及。也就没去了解。官方文档地址
特殊情况查询(HTML标签过滤)
官方文档提供的过滤HTML标签配置文档
日常应用中,solr里可能存储着我们某条数据对应的大量文本内容或者富文本内容,那么富文本中可能包含大量的HTML标签。这时如果针对文本内容进行检索,但是不希望检索到这些HTML标签。
例如:想要检测p,但是不希望检索<p>标签.如果我们不加以设置,则检索p字母的同时,<p>标签会被检索出来。solr官方提供了过滤HTML标签的配置
在field对应的type的fieldType下配置。例如filed为
<filed name=“content” type=“text_general” indexed=“true”>
则在managed-schema文件中找到<fieldType name=“text_general”/>标签。在<analyzer>下添加charFilter
<charFilter class="solr.HTMLStripCharFilterFactory"/>
此配置要放在tokenizer标签前面,如图
在此fieldType为text_general类型的filed建立索引和查询的时候都配置了。
验证:
原始数据如下:
查询content中包含p的数据,如果配置正确,则图中标红的数据中除了HTML的p标签,其他内容是没有p的,所以不会被查出来
可以看到,确实没有查出来。说明配置正确
删除数据
-
根据唯一键删除
curl -X POST -H 'Content-Type:application/json' 'http://localhost:8983/solr/person/update?commit=true' -d '{"delete":"1284470706704240649"}'
-
条件删除,删除age大于13的数据
curl -X POST -H 'Content-Type:application/json' 'http://localhost:8983/solr/person/update?commit=true' -d '{"delete":{"query":"age:{13 TO *]"}}'
删除Core
./solr delete -c person
或者
curl 'http://localhost:8983/solr/admin/cores?action=UNLOAD&core=article&deleteIndex=true&deleteDataDir=true&deleteInstanceDir=true'
关闭、重启solr
./solr stop
# 重启solr
./solr restart
总结
以上步骤基本可以通过命令行的可以完成95%以上。当然solr最重要的还是查询语法
对于solr更详细的使用,可以参考其他四篇solr使用的博文
传送门
附录
-
solr的默认端口是多少?8983
-
CopyField的作用是什么?定义
答:当我们为solr配置了多个field时,但是在某些场景下展示给用户的搜索域涵盖了这些filed。那么这个时候我们就需要CopyField。简单来说就是,对用户来说,一个搜索框,我随便输入什么,你都能在这个搜索框内搜出对应的不同的field的内容.
例如:一个搜索框,可以根据用户ID或者名字来搜索,但是我们不知道用户输入的是ID还是名字。于是,我们搞了一个copyField的东西,将id和name都对应到一个新的field中.
配置如下:
<field name="userName",type="string",indexed="true",stored="true"/> <!--userId是唯一键,所以需要required=true--> <field name="userId",type="string",indexed="true",stored="true",rquired="true"/> <!--multiValued=true一定要设置--> <field name="combaSearch" type="string",stored="true",indexed="true",multiValued="true"/> <!--配置combaSearch对应的源--> <copyField source="userName",dest="combaSearch"/> <copyField source="userId",dest="combaSearch"/>
-
managed-schema中的fieldType和field的关系是什么?
答:filed是solr的core中对应的字段。而fieldType则是具体字段的所使用的类型。可以自定义FieldType.,如果type配置了没有对应的fieldType则该field无效
-
dynamicField是干嘛用的?定义
dynamicField是为了解决在使用solr过程中,忽然发现core忘记定义一个字段,那么如果该字段符合dynamicField的匹配规则,则无需定义也可以使用solr查询出来.实际使用中感觉没啥大用