Solr操作数据

环境准备

Solr整合Tomcat9

DataImport 导入数据

添加jar包

D:\RunServer\solr-8.5.1\dist下的solr-dataimporthandler*.jar、mysql-connector-java-5.1.42.jar,复制到D:\RunServer\apache-tomcat-9.0.22-solr8.5-8081\webapps\solr\WEB-INF\lib

配置solr:找到自带的中文分词器
D:\RunServer\solr-8.5.1\contrib\analysis-extras\lucene-libs下所有的jar复制到D:\RunServer\apache-tomcat-9.0.22-solr8.5-8081\webapps\solr\WEB-INF\lib

注:icu的包可能报错,它不是分词的核心包,报错可以删除

配置中文分词器

修改D:\RunServer\solr_home\demo_core\conf【managed-schema】文件,在文件最后方插入中文分词器

<!-- ChineseAnalyzer -->
<fieldType name="solr_cnAnalyzer" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
  </analyzer>
</fieldType>

managed-schema文件详解

在managed-schema.xml文件中,主要配置SolrCoe数据信息,包括:Field和FieldType的定义等信息,在solr中,Field和FieldType都需要先定义后使用

Field详解

学习详细参考:http://blog.csdn.net/mine_song/article/details/58065323

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
name:指定域的名称(自定义)
type:指定域的类型
indexed:是否索引
是:(将分好的词进行索引,索引的目的,就是为了搜索)
否:不索引,也就是不对该field域进行搜索。
stored:是否存储
是:将field域中的内容存储到文档域中。存储的目的,就是为了搜索页面显示取值用的
否:不将field域中的内容存储到文档域中。不存储,则搜索页面中没法获取该field域的值。
required:是否必须
multiValued:是否多值,比如查询数据需要关联多个字段数据,一个Field存储多个值信息,必须将multiValued设置为true。
dynamicField详解
<dynamicField name="*_i"  type="pint"    indexed="true"  stored="true"/>
<dynamicField name="*_is" type="pint"    indexed="true"  stored="true"  multiValued="true"/>
<dynamicField name="*_s"  type="string"  indexed="true"  stored="true" />
<dynamicField name="*_s_ns"  type="string"  indexed="true"  stored="false" />
<dynamicField name="*_ss" type="string"  indexed="true"  stored="true" multiValued="true"/>
<dynamicField name="*_l"  type="plong"   indexed="true"  stored="true"/>
......

name为*_i,定义它的type为int,那么在使用这个字段的时候,任何以_i结果的字段都被认为符合这个定义

uniqueKey
<uniqueKey>id</uniqueKey>

其中的id是在Field标签中已经定义好的域名,而且该域设置为required为true。
一个managed-schema文件中必须有且仅有一个唯一键

copyField 复制域

应用场景:我们在搜索时比如输入java,一篇文章分为标题、简介、内容等很多字段,输入的关键字需要制定solr中的域进行检索,不可能从一个表中将所有字段进行索引,因为有些字段不需要索引,所以出现copyField域,把多个域的关键词复制到同一个域,多个域时,可以放到一个域中。就不用定义那么多域了。搜索比较方便
实例:
Source:是Field域的名称
Dest:是destination的缩写 目标域

fieldType 域类型
<fieldType name="pint" class="solr.IntPointField" docValues="true"/>
<fieldType name="pfloat" class="solr.FloatPointField" docValues="true"/>
<fieldType name="plong" class="solr.LongPointField" docValues="true"/>
<fieldType name="pdouble" class="solr.DoublePointField" docValues="true"/>

<fieldType name="pints" class="solr.IntPointField" docValues="true" multiValued="true"/>
<fieldType name="pfloats" class="solr.FloatPointField" docValues="true" multiValued="true"/>
<fieldType name="plongs" class="solr.LongPointField" docValues="true" multiValued="true"/>
<fieldType name="pdoubles" class="solr.DoublePointField" docValues="true" multiValued="true"/>
solr的fieldtype属性javaBean属性类型
stringString
booleanBoolean
pintInteger
pdoubleDouble
plongLong
pfloatFloat
pdateDate
分词器
<fieldType name="solr_cnAnalyzer" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
	<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
  </analyzer>
  <analyzer type="query">
	<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
  </analyzer>
</fieldType>
Name:指定域类型的名称
Class:指定该域类型对应的solr的类型
Analyzer:指定分析器
Type:index、query,分别指定搜索和索引时的分析器
Tokenizer:指定分词器
Filter:指定过滤器

修改solrconfig.xml文件

找到D:\RunServer\solr_home\demo_core\conf文件夹下的【solrconfig.xml】,添加dataimport。首先查询是否存在dataimport的requestHandler,如果不存在,因此需要手动添加。为了以后便于维护此文件,我们就在requestHandler起始位置,约为720行处,添加如下内容

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
    <str name="config">data-config.xml</str>
    </lst>
</requestHandler>

创建data-config.xml

data-config.xml作用:数据库连接相关信息、SQL以及查询结果映射对应域中。在solrconfig.xml同级目录下,创建data-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig> 
  <dataSource type="JdbcDataSource" 
              driver="com.mysql.jdbc.Driver" 
              url="jdbc:mysql://localhost:3306/solr" 
              user="root" 
              password="root"/> 
  <document> 
		<entity name="products"  query="select pid,pname,catalog_name,price,description,picture from products ">
				 <field column="pid" name="id"/>  
				 <field column="pname" name="prod_pname"/>  
				 <field column="catalog_name" name="prod_catalog_name"/>  
				 <field column="price" name="prod_price"/>  
				 <field column="description" name="prod_description"/>  
				 <field column="picture" name="prod_picture"/>  
		</entity> 
  </document> 
</dataConfig>
Query代表:查询的SQL语句
Column代表:SQL查询的列名
Name代表:Solr 域Filed中的域名

定义域

修改同目录下的managed-schema文件

  1. 在文件最后方插入中文分词器
  2. 配置其Field域。来配置字段【这里的名字要与data-config中的域名一模一样】
<!-- prod_pname需要模糊查询(中文分词),故将其类型改为solr_cnAnalyzer -->
<field name="prod_pname" type="solr_cnAnalyzer" indexed="true" stored="true" required="true"  /> 
<field name="prod_catalog_name" type="string" indexed="true" stored="true" required="true"  /> 
<field name="prod_price" type="pdouble" indexed="true" stored="true" required="true"  /> 
<field name="prod_description" type="solr_cnAnalyzer" indexed="true" stored="true" required="true"  /> 
<field name="prod_picture" type="string" indexed="false" stored="true" required="true"  />

启动服务

  1. 启动Tomcat服务器
  2. 查看数据导入结果

重启Tomcat服务器,进入 guo_core ,测试中文分词器效果。重启Tomcat服务器,进入 demo_code中 DataImport 执行 execute

【报错1】SSL

【解决1】更换对应版本mysql.jar

【报错2】EDT

【解决2】

jdbc:mysql://192.168.31.100:3306/solr?serverTimezone=UTC

查询描述

q 查询的关键字,此参数最为重要,例如,q=id:1,默认为q=*:*,
fl 指定返回(回显)哪些字段,用逗号或空格分隔,注意:字段区分大小写,例如,fl= id,title,sort
start 返回结果的第几条记录开始,一般分页用,默认0开始
rows 指定返回结果最多有多少条记录,默认值为 10,配合start实现分页
sort 排序方式,例如id desc 表示按照 “id” 降序
wt (writer type)指定输出格式,有 xml, json等
fq (filter query)过虑查询,提供一个可选的筛选器查询。返回在q查询符合结果中同时符合的fq条件的查询结果,例如:q=id:1&fq=sort:[1 TO 5],找关键字id为1 的,并且sort是1到5之间的。
df 默认的查询字段,一般默认指定。
h1 是否高亮

客户端查询语法

  1. q查询关键字,查询所有使用*😗
  2. fq (filter query)过滤查询,作用:在q查询符合结果中同时是fq查询符合的,例如:请求fq是一个数组(多个值)。过滤查询价格从1到10的记录。也可以在“q”查询条件中使用product_price:[1 TO 10],也可以使用“*”表示无限。
  3. sort 排序,格式:sort=+<desc|asc>[,+<desc|asc>]….
  4. start - 分页显示使用,开始记录下标,从0开始
  5. rows - 指定返回结果最多有多少条记录,配合start来实现分页。实际开发时,知道当前页码和每页显示的个数最后求出开始下标。
  6. fl - 指定返回那些字段内容,用逗号或空格分隔多个(回显)
  7. df-指定一个搜索默认Field
  8. wt - (writer type)指定输出格式
  9. hl 是否高亮 ,设置高亮Field,设置格式前缀和后缀。hl.fl 指定高亮域的名称
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Strive_MY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值