solr使用五(利用命令行使用solr的完整过程附过滤HTML标签解决方法)

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

  1. 使用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
  1. 同理可以使用postman请求
    在这里插入图片描述

注意:由于solr中的数据的唯一键默认值是id,我们需要更改为我们自定义的useId,但是通过curl的方式又更改不了,只能手动去修改managed-schema文件的uniqueKey,并把id注注释掉。

向Core中添加数据

solr的ip:port/solr/core的名字/update?commit=true

  1. 使用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官网或者这篇文章这里

  1. 使用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'
  1. 使用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的,所以不会被查出来
在这里插入图片描述
可以看到,确实没有查出来。说明配置正确

删除数据

  1. 根据唯一键删除

    curl -X POST -H 'Content-Type:application/json' 'http://localhost:8983/solr/person/update?commit=true' -d '{"delete":"1284470706704240649"}'
    
  2. 条件删除,删除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使用的博文
传送门

附录

  1. solr的Stream API

  2. solr的默认端口是多少?8983

  3. 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"/>
      
    
  4. managed-schema中的fieldType和field的关系是什么?

    答:filed是solr的core中对应的字段。而fieldType则是具体字段的所使用的类型。可以自定义FieldType.,如果type配置了没有对应的fieldType则该field无效

  5. dynamicField是干嘛用的?定义

    dynamicField是为了解决在使用solr过程中,忽然发现core忘记定义一个字段,那么如果该字段符合dynamicField的匹配规则,则无需定义也可以使用solr查询出来.实际使用中感觉没啥大用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值