Solr入门之官方文档6.0阅读笔记系列(三)

本文深入探讨了Solr中的字段类型及其配置,包括字段类型的定义、动态字段的应用、日期和货币字段的处理方式等,旨在帮助读者理解如何有效管理和查询索引数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第二部分 Documents, Fields, and Schema Design
这部分包含以下内容:
Solr Field Types: solr中字段类型的详细信息.包含字段类型在solr默认的约束中.
Defining Fields: 描述如何在solr中定义字段.
Copying Fields: 描述如何将一个字段中数据复制到另外一个字段中去
Dynamic Fields: 使用动态字段去捕捉那些没有在你索引中明确定义个字段.
Schema API: 使用http请求的方式来获取schema中的信息或者去创建一个新的字段或者复制字段规则.
Other Schema Elements: 描述solr schema中其他重要的元素.
Putting the Pieces Together: 一个高级视角去观察solr schema和其中的元素如何工作.
DocValues: 描述一个创建一个文档索引能被快速的查询到.
Schemaless Mode: 自动添加以前未知的schema字段使用 value-based 字段类型猜测.

对于字段的约束文件
如果使用的是managed-schema 可以更好 支持通过Schema API 编辑
schema.xml是老版本的,不支持使用Schema API进行编辑
如果使用了solrcloud模式,那么只能通过脚本上传和下载配置文件编辑后再上传了.
Solr Field Types
字段类型决定solr如何去解析和查询数据.很多类型solr已经默认定义了,你也可以自己定义字段的类型:
这部分主要包含一下内容点:
Field Type Definitions and Properties
Field Types Included with Solr
Working with Currencies and Exchange Rates
Working with Dates
Working with Enum Fields
Working with External Files and Processes
Field Properties by Use Case
Related Topics
SchemaXML-DataTypes
FieldType Javadoc

Field Type Definitions and Properties
(字段类型的定义和他的属性)
一个字段类型的定义可以包含四个部分的信息:
1.字段类型的名称(必须的)
2.具体实现类的名称(必须的)
3.如果这个字段类型是TextField ,需要定义一下这个字段类型的分词器相关属性
4.字段类型的属性---需要依赖实现的类,一些属性可能是强制的

Field Type Definitions in schema.xml

字段类型是被定义在schema.xml中.每个字段类型是被定义在 fieldtype 这个xml 标签之间.
他们能随意的根据字段类型进行分组.这是一个例子,定义了一个字段类型名字叫 text_general:

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"
/>
<!-- in this example, we will only use synonyms at query time
<filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt"
ignoreCase="true" expand="false"/>
-->
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"
/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt"
ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
在上文例子中的第一行包含了字段类型的名称,text_general,和实现类的名称,solrTextField.详细的关于分词器的定义信息,描述在Understanding Analyzers, Tokenizers, and Filters.

实现类主要确保字段经过正确的处理. 在schema.xml中,字符solr是org.apache.solr.schema或者org.apache.solr.analysis的缩写.实际上,solr.TextField 应该是 org.apache.solr.schema.TextField..

Field Type Properties

字段类型 class 定义了大多数的字段类型的行为信息.但是可选属性也是能被定义的.
例如下面的例子中,定义了一个名字为date类型的字段类型,定义了两个属性,sortMissingLast 和
 omitNorms.

<fieldType name="date" class="solr.TrieDateField"
sortMissingLast="true" omitNorms="true"/>
字段类型的属性能被分为三大类型:
1.字段类型class所指定的属性
2.solr对所有字段类型都支持的通用属性
3.字段的默认属性.你能更改这些属性代替默认值
General Properties
name : 类型名称(提了建议定义规则)
class:前缀是solr.开头solr会自动搜索包,使用第三方要写全名称
positionIncrementGap: 对于多值字段,指定多个值之间的距离
autoGeneratePhraseQueries : true/false 是否生成临近的查询短语
docValuesFormat:定义使用这个字段类型的字段的文档值的类型.这里需要在sorconfig.xml配置解码器
postingsFormat:定义使用这个字段类型的字段的PostingsFormat规则.需要在solrconfig.xml中配置解码器;

解码器存在版本兼容问题,最好是升级版本后,做一次全量.

Field Default Properties

默认值可以自己覆盖,和字段类型及版本也关系version="1.6"的默认值如下:

定义一个字段类型的时候可以参考
docvalues是啥???

Field Types Included with Solr

org.apache.solr.schema这个包里有默认的字段类即使 默认的实现类

类型很多,需要用时查取判断即可
 <field name="uuid" type="UUID"  default="NEW"/>


Working with Currencies and Exchange Rates

货币和汇率部分
配置:
<fieldType name="currency" class="solr.CurrencyField" precisionStep="8"
defaultCurrency="USD" currencyConfig="currency.xml" />

两种形式
一个是使用本地的配置(默认)
<fieldType name="currency" class="solr.CurrencyField" precisionStep="8"
defaultCurrency="USD" currencyConfig="currency.xml" />

一个是使用网上的汇率信息,定时更新
<fieldType name="currency" class="solr.CurrencyField" precisionStep="8"
providerClass="solr.OpenExchangeRatesOrgProvider"
refreshInterval="60"
ratesFileLocation="http://www.openexchangerates.org/api/latest.json?app_id=yourPerso
nalAppIdKey"/>


Working with Dates

Date Formatting
TrieDateField and DateRangeField
DateTimeFormatter.ISO_INSTANT 
YYYY-MM-DDThh:mm:ssZ
Z is a literal 'Z' character indicating that this string representation of the date is in UTC


查询需要转译
This is normally an invalid query:
datefield:1972-05-20T17:33:18.772Z
These are valid queries:
datefield:1972-05-20T17\:33\:18.772Z
datefield:"1972-05-20T17:33:18.772Z"
datefield:[1972-05-20T17:33:18.772 TO *]


这个感觉不是很好,直接用java的不行吗
Date Range Formatting

Date Math
支持表达式运算,当前时间可以用 now
Date Math Syntax

能做加减运算和近似值,下面是接个例子:
For example: this represents a point in time two months from now:
NOW+2MONTHS
This is one day ago:
NOW-1DAY
A slash is used to indicate rounding. This represents the beginning of the current hour:
NOW/HOUR
The following example computes (with millisecond precision) the point in time six months and three days into the
future and then rounds that time to the beginning of that day:
NOW+6MONTHS+3DAYS/DAY
Note that while date math is most commonly used relative to NOW it can be applied to any fixed moment in time
as well:
1972-05-20T17:33:18.772Z+6MONTHS+3DAYS/DAY


Request Parameters That Affect Date Math

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

TZ


More DateRangeField Details
Intersects (default), Contains, Within. 
fq={!field f=dateRange op=Contains}[2013 TO 2018]


Working with Enum Fields

枚举类型,设置可选值,能预定义排序顺序.
Defining an EnumField in schema.xml
<fieldType name="priorityLevel" class="solr.EnumField" enumsConfig="enumsConfig.xml"
enumName="priority"/>
<fieldType name="riskLevel" class="solr.EnumField" enumsConfig="enumsConfig.xml"
enumName="risk" />


enumsConfig: 配置文件的名称,没有指定默认在conf下
enumName:配置文件中枚举使用类型的名称

<?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>


排序是不能改变的,只能在末尾添加.除非你改变后重新创建索引

Working with External Files and Processes

The ExternalFileField Type

外部文件是不能被索引的,只能通过查询函数查询或者展示.

存储那些不经常改变的.
<fieldType name="entryRankFile" keyField="pkId" defVal="0" stored="false"
indexed="false" class="solr.ExternalFileField" valType="pfloat"/>

默认的文件位置是在$SOLR_HOME/data 文件名称为external_fieldname or external_fieldname.*

这里能看出来分布式的情况可能不能用 ,看看就行了

Field Properties by Use Case

定义一个字段类型时可以参考这张表,根据目的性


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值