文档章节

搜索引擎(Solr-索引详解)

这很耳东先生
 这很耳东先生
发布于 02/19 20:09
字数 2271
阅读 20
收藏 0

时间字段类型特别说明

Solr中提供的时间字段类型( DatePointField, DateRangeField,废除的TrieDateField )是以时间毫秒数来存储时间的。

要求字段值以ISO-8601标准格式来表示时间:YYYY-MM-DDThh:mm:ssZ

Z表示是UTC时间(注意:就没有时区了)。1999-05-20T17:33:18Z

秒上可以带小数来表示毫秒,超出精度部分会被忽略:  

1972-05-20T17:33:18.772Z
1972-05-20T17:33:18.77Z
1972-05-20T17:33:18.7Z

公元前:在前面加减号 - 9999后,在前面加加号 +

注意:查询时如果是直接的时间串,需要用转移符转义:

datefield:1972-05-20T17\:33\:18.772Z
datefield:"1972-05-20T17:33:18.772Z"
datefield:[1972-05-20T17:33:18.772Z TO *]

DateRangeField 时间段类型特别说明

DateRangeField用来支持对时间段数据的索引,它遵守上一页讲到的时间格式,支持两种时间段表示方式:

方式一:截断日期,它表示整个日期跨度的精确指示。

方式二:范围语法 [ TO ]   { TO }

2000-11      	表示2000年11月整个月.
2000-11T13    	表示200年11月每天的13点这一个小时
-0009        	 公元前10年,0000是公元前1年。
[2000-11-01 TO 2014-12-01] 		日到日
[2014 TO 2014-12-01] 	2014年开始到2014-12-01止.
[* TO 2014-12-01] 		2014-12-01(含)前.

时间数学表达式

Solr中还支持用 NOW +- 时间的数学表达式来灵活表示时间。语法 NOW +- 带单位的时间数,/单位 截断。可用来表示时间段。

NOW+2MONTHS
NOW-1DAY
NOW/HOUR
NOW+6MONTHS+3DAYS/DAY
1972-05-20T17:33:18.772Z+6MONTHS+3DAYS/DAY

NOW在查询中使用时,可为NOW指定值

q=solr&fq=start_date:[* TO NOW]&NOW=1384387200000

EnumFieldType 枚举字段类别说明

EnumFieldType  用于字段值是一个枚举集,且排序顺序可预定的情况,如新闻分类这样的字段。定义非常简单:

<fieldType name="priorityLevel" class="solr.EnumFieldType" docValues="true" enumsConfig="enumsConfig.xml" enumName="priority"/>

enumsConfig:指定枚举值的配置文件,绝对路径或相对 内核conf/的相对路径
enumName:指定配置文件的枚举名。排序顺序是按配置的顺序。
docValues : 枚举类型字段必须设置 true;

枚举配置示例

<?xml version="1.0" ?>
<enumsConfig>
  <enum name="priority">
    <value>Not Available</value>
    <value>Low</value>
    <value>Medium</value>
    <value>High</value>
    <value>Urgent</value>
  </enum>
  <enum name="risk">
    <value>Unknown</value>
    <value>Very Low</value>
    <value>Low</value>
    <value>Medium</value>
    <value>High</value>
    <value>Critical</value>
  </enum>
</enumsConfig>

练习4 定义Field

prodId:商品id,字符串,不索引、存储;
name: 商品名称,字符串,分词、索引、存储
simpleIntro:商品简介,字符串,分词、索引、不存储
price:价格,整数(单位分),索引,存储
uptime:上架时间,索引、docValues  支持排序

<field name=“” type=“” default=“” indexed="true" stored="true"/>

dynamic Field  动态字段

问:如果模式中有近百个字段需要定义,其中有很多字段的定义是相同,重复地定义是不是很烦?
可不可以定一个规则,字段名以某前缀开头或结尾的是相同的定义配置,那这些重复字段就只需要配置一个,保证提交的字段名称遵守这个前缀、后缀即可。
这就是动态字段。
如:整型字段都是一样的定义,则可以定义一个动态字段如下:

<dynamicField name="*_i" type=“my_int" indexed="true" stored="true"/>

也可以是前缀,如    name=“i_*”

uniqueKey 唯一键

指定用作唯一键的字段,非必需。

<uniqueKey>id</uniqueKey>

唯一键字段不可以是保留字段、复制字段,且不能分词。

Similarity 相关性计算类配置

如果默认的相关性计算模型BM25Similarity不满足你应用的特殊需要,你可在schema中指定全局的或字段类型局部的相关性计算类

<similarity class="solr.SchemaSimilarityFactory">
  <str name="defaultSimFromFieldType">text_dfr</str>
</similarity>
<fieldType name="text_dfr" class="solr.TextField">
  <analyzer ... />
  <similarity class="solr.DFRSimilarityFactory">
    <str name="basicModel">I(F)</str>
    <str name="afterEffect">B</str>
    <str name="normalization">H3</str>
    <float name="mu">900</float>
  </similarity>
</fieldType>

小结

Schema API 介绍

内容概览

1、Schema操作API总体介绍

Solr中强烈推荐使用Schema API来管理集合/内核的模式信息,可以读、写模式信息。通过API来更新模式信息,solr将自动重载内核。但是请注意:模式修改并不会自动重索引已索引的文档,只会对后续的文档起作用,如果必要,你需要手动重索引(删除原来的,重新提交文档)。

更新 Schema

发送 post请求到 /collection/schema  ,以JSON格式提交数据,在json中说明你要进行的更新操作及对应的数据(一次请求可进行多个操作),操作的定义见下页。

更新操作定义

add-field: 添加一个新字段.
delete-field: 删除一个字段.
replace-field: 替换一个字段,修改.
add-dynamic-field: 添加一个新动态字段.
delete-dynamic-field: 删除一个动态字段
replace-dynamic-field: 替换一个已存在的动态字段
add-field-type: 添加一个fieldType.
delete-field-type: 删除一个fieldType.
replace-field-type: 更新一个存在的fieldType
add-copy-field: 添加一个复制字段规则.
delete-copy-field: 删除一个复制字段规则.

2、V1、V2两个版本API说明

V1老版本的api,V2新版本的API,当前两个版本的API都支持,将来会统一到新版本。两个版本的API只是请求地址上的区别,参数没区别。

V1: http://localhost:8983/solr/gettingstarted/schema
V2: http://localhost:8983/api/cores/gettingstarted/schema

3、FieldType字段类别操作

添加一个字段类别 add-field-type

一个Analyzer:

curl -X POST -H 'Content-type:application/json' --data-binary '{
  "add-field-type" : {
     "name":"myNewTxtField",
     "class":"solr.TextField",
     "positionIncrementGap":"100",
     "analyzer" : {
        "tokenizer":{
           "class":"solr.WhitespaceTokenizerFactory" },
        "filters":[{
           "class":"solr.WordDelimiterFilterFactory",
           "preserveOriginal":"0" }]}}
}' http://localhost:8983/solr/gettingstarted/schema

两个Analyzer:

curl -X POST -H 'Content-type:application/json' --data-binary '{
  "add-field-type":{
     "name":"myNewTextField",
     "class":"solr.TextField",
     "indexAnalyzer":{
        "tokenizer":{
           "class":"solr.PathHierarchyTokenizerFactory",
           "delimiter":"/" }},
     "queryAnalyzer":{
        "tokenizer":{
           "class":"solr.KeywordTokenizerFactory" }}}
}' http://localhost:8983/api/cores/gettingstarted/schema

练习:
1、添加示例;
2、添加一个FieldType  myNewZhText,索引的分词器用IKAnalyzer,查询的分词器用IKAnaylzer + 同义词Filter

删除一个字段类别 delete-field-type

curl -X POST -H 'Content-type:application/json' --data-binary '{
  "delete-field-type":{ "name":"myNewTxtField" }
}' http://localhost:8983/api/cores/gettingstarted/schema

替换一个字段类别 replace-field-type

curl -X POST -H 'Content-type:application/json' --data-binary '{
  "replace-field-type":{
     "name":"myNewTxtField",
     "class":"solr.TextField",
     "positionIncrementGap":"100",
     "analyzer":{
        "tokenizer":{
           "class":"solr.StandardTokenizerFactory" }}}
}' http://localhost:8983/api/cores/gettingstarted/schema

4、Field 字段操作

添加一个字段 add-field

curl -X POST -H 'Content-type:application/json' --data-binary '{
  "add-field":{
     "name":"sell_by",
     "type":"pdate",
     "stored":true }
}' http://localhost:8983/api/cores/gettingstarted/schema

删除一个字段 delete-field

curl -X POST -H 'Content-type:application/json' --data-binary '{
  "delete-field" : { "name":"sell_by" }
}' http://localhost:8983/api/cores/gettingstarted/schema

替换一个字段 replace-field

curl -X POST -H 'Content-type:application/json' --data-binary '{
  "replace-field":{
     "name":"sell_by",
     "type":"date",
     "stored":false }
}' http://localhost:8983/api/cores/gettingstarted/schema

练习:
添加如下商品字段
type:商品类别,字符串,多值,不分词、索引,需要分面查询(docValues)
brand: 品牌,字符串,单值,不分词、索引,需要分面查询(docValues)
msales:月销量,整数,单值,索引、存储,支持排序
修改如下商品字段
price:价格,整数(单位分),索引,存储,支持排序

5、dynamicField 动态字段操作

添加一个动态字段 add-dynamic-field

curl -X POST -H 'Content-type:application/json' --data-binary '{
  "add-dynamic-field":{
     "name":"*_s",
     "type":"string",
     "stored":true }
}' http://localhost:8983/api/cores/gettingstarted/schema

删除一个动态字段 delete-dynamic-field

curl -X POST -H 'Content-type:application/json' --data-binary '{
  "delete-dynamic-field":{ "name":"*_s" }
}' http://localhost:8983/api/cores/gettingstarted/schema

替换一个动态字段 replace-dynamic-field

curl -X POST -H 'Content-type:application/json' --data-binary '{
  "replace-dynamic-field":{
     "name":"*_s",
     "type":"text_general",
     "stored":false }
}' http://localhost:8983/solr/gettingstarted/schema

6、copyField 复制字段操作

添加复制字段 add-copy-field

curl -X POST -H 'Content-type:application/json' --data-binary '{
  "add-copy-field":{
     "source":"shelf",
     "dest":[ "location", "catchall" ]}
}' http://localhost:8983/api/cores/gettingstarted/schema

删除复制字段 delete-copy-field

curl -X POST -H 'Content-type:application/json' --data-binary '{
  "delete-copy-field":{ "source":"shelf", "dest":"location" }
}' http://localhost:8983/api/cores/gettingstarted/schema

一次请求多个操作示例-1

curl -X POST -H 'Content-type:application/json' --data-binary '{
  "add-field-type":{
     "name":"myNewTxtField",
     "class":"solr.TextField",
     "positionIncrementGap":"100",
     "analyzer":{"tokenizer":{
           "class":"solr.WhitespaceTokenizerFactory" },
        "filters":[{
           "class":"solr.WordDelimiterFilterFactory",
           "preserveOriginal":"0" }]}},
   "add-field" : {
      "name":"sell_by",
      "type":"myNewTxtField",
      "stored":true }
}' http://localhost:8983/solr/gettingstarted/schema

一次请求多个操作示例-2

curl -X POST -H 'Content-type:application/json' --data-binary '{
  "add-field":[
     { "name":"shelf",
       "type":"myNewTxtField",
       "stored":true },
     { "name":"location",
       "type":"myNewTxtField",
       "stored":true }]
}' http://localhost:8983/solr/gettingstarted/schema

7、获取schema信息

获取整个schema

GET /collection/schema

可以通过wt请求参数指定返回的格式:json,xml, schema.xml

http://localhost:8983/api/cores/mycore/schema?wt=xml

获取字段

GET /collection/schema/fields
GET /collection/schema/fields/fieldname

请求参数有:

wt:   json/xml            fl:指定需要返回的字段名,以逗号或空格间隔
showDefaults:true/false ,是否返回字段的默认属性
includeDynamic:true/false,在path中带有fieldname  或指定了 fl的情况下才有用。

获取动态字段

GET /collection/schema/dynamicfields
GET /collection/schema/dynamicfields/name

可用请求参数:wt、showDefaults

http://localhost:8983/api/cores/mycore/schema/dynamicfields?wt=xml

获取字段类别

GET /collection/schema/fieldtypes
GET /collection/schema/fieldtypes/name

可用请求参数:wt、showDefaults

http://localhost:8983/api/cores/mycore/schema/fieldtypes?wt=xml

获取复制字段

GET /collection/schema/copyfields

可用请求参数:wt、 source.fl、 dest.fl

获取其他信息

GET /collection/schema/name               获取schema的name
GET /collection/schema/version	获取schema的版本
GET /collection/schema/uniquekey	获取唯一键字段
GET /collection/schema/similarity	获取全局相关性计算类

可用请求参数:wt

 

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
这很耳东先生
粉丝 3
博文 73
码字总数 231885
作品 0
广州
私信 提问
搜索引擎(Solr-部署详解)

Solr两种部署模式介绍 Solr的两种部署模式 Solr程序包安装好后,可以以两种模式来启动solr服务器: 1.Standalone Server 独立服务器模式 适用于数据规模不大的场景 2.SolrCloud 分布式集群模...

这很耳东先生
02/14
0
0
搜索引擎(Solr-模式详解)

Schema介绍 Schema 是什么? 问题1:在lucene中我们要对文档字段进行索引存储,需要如何做? 问题2:现在我们使用Solr搜索服务平台了,不需要编码了,还需要定义如何索引存储字段吗? 需要一...

这很耳东先生
02/15
0
0
搜索引擎(Solr-索引详解2)

学习目标 1.掌握SolrJ的使用。 2.掌握索引API 3.掌握结构化数据导入DIH SolrJ介绍 SolrJ是什么? Solr提供的用于JAVA应用中访问solr服务API的客户端jar。在我们的应用中引入solrj: SolrJ的核...

这很耳东先生
02/22
0
0
Solr简单介绍

简介 Solr是一个高性能,采用Java5开发,Solr基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提...

邵鸿鑫
2016/06/29
0
0
Elasticsearch与Solr

Elasticsearch简介* Elasticsearch是一个实时的分布式搜索和分析引擎。它可以帮助你用前所未有的速度去处理大规模数据。 它可以用于全文搜索,结构化搜索以及分析,当然你也可以将这三者进行...

满小茂
2016/01/07
134
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot引入第三方jar包或本地jar包的处理方式

在开发过程中有时会用到maven仓库里没有的jar包或者本地的jar包,这时没办法通过pom直接引入,那么该怎么解决呢 一般有两种方法 - 第一种是将本地jar包安装在本地maven库 - 第二种是将本地j...

独钓渔
今天
2
0
五、MyBatis缓存

一、MyBatis缓存介绍 缓存的使用可以明显的加快访问数据速度,提升程序处理性能,生活和工作中,使用缓存的地方很多。在开发过程中,从前端-->后端-->数据库等都涉及到缓存。MyBatis作为数据...

yangjianzhou
今天
2
0
最近研究如何加速UI界面开发,有点感觉了

最近在开发JFinal学院的JBolt开发平台,后端没啥说的,做各种极简使用的封装,开发者上手直接使用。 JBolt开发平台包含常用的用户、角色、权限、字典、全局配置、缓存、增删改查完整模块、电...

山东-小木
今天
3
0
《月亮与六便士》的读后感作文3000字

《月亮与六便士》的读后感作文3000字: 看完英国作家威廉.萨默塞特.毛姆所著《月亮与六便士》(李继宏译),第一疑问就是全书即没提到“月亮”,也没提到“六便士”。那这书名又与内容有什么...

原创小博客
昨天
2
0
微信网页授权获取用户信息(ThinkPHP5)+ 微信发送客服消息(一)

以thinkphp5为实例,创建控制器 class Kf extends Controller { /** * [protected description]微信公众号appid * @var [type] */ protected $appid = "xxxxxxxxxxxxxxx"; /** * [protected......

半缘修道半缘君丶
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部