目录
配置solr服务和需要的知识
这里我就不多介绍了,网上有很多教程,官网也有。自己去找下资料就可以了,网上千篇一律的,本文章主要介绍solr的语法使用。本教程会用到许多跟关系型数据库互相联想的方式,可以方便那些只用过主流数据库mysql、oracle的人理解,这也是我个人的见解。因为我也是只学过这些主流数据库,而没有使用过no sql类型的数据库,我的联想可能不太准确,各有各的见解,如果你觉得有用的话,当然最好啦。本教程侧重于应用,理论方面就不多说,官网都很多的。那废话不多说,开始我们的solr之旅吧。
学习本solr需要以下这些知识和配置:
(1)当然提到solr,中文分词器是必不可上的,在配置的时候记得配上text_ik。
(2)新建一个document,这个document用来存储你要存储的数据,就好像你操作数据库的时候需要对应的库一样,这个相当于库,这里面可以放你的表数据。
(3)需要学习spring-data,尤其spring-data-jpa,如果需要发掘更深一步的solr操作,这个一定需要掌握。
配置要存储的字段属性、名称
本配置相当于配置数据库中的域名和域名属性,其实solr也叫域,那么我们跟操作关系型数据库一样,就需要了解如何建表和和表字段了,当然还需要字段有哪些属性可以配置,这些属性对应有哪些值和不进行配置的时候默认值是什么。
(1)首先建“表”
其实在我们创建document的时候相应的就已经创建了对应的表了,我们只需要找到solr文件下的 managed-schema.XML,solr利用xml文件将字段注入到其对应的库中,所以只要在这个文件进行配置就可以了。这是手动的配法,当然如果你有安装schedule api可以直接可视化配置。
(2)定义字段属性
<1>如何配置,以什么形式配置?
在xml配置对应的bean注入到库中。
<2>配置一个基础的bean,需要有什么属性
配置<field/>标签:
<field name="roomId" type="string" indexed="true" stored="true"/>
其中name属性是配置字段的名字,type是数据类型,index是否打开查询即query是否能使用,stored是否放到内存中,如果放置就能在内存中看到,如果为false,那么你这么查询也看不到数据了。后面这两个字段其实你不进行定义,其默认值本来就是true,但是本文提出来是为了,如果你看不到或者搜索不到,是不是把这两个字段设为了false。最后详细讲下type吧,可以直接用solr. 包里的内容定义,也可以用fieldType去去定义定义完后以后就方便使用了。以下的定义数据类型给出这两种配置方式。
定义数据类型:
有两种定义的方式(推荐第一种):
1、定义 <fieldType/>
配置 <fieldType/>标签(name自己定义数据类型名字,class是对应的数据类型的包位置):
<fieldType name="string" class="solr.StrField" />
然后就能在<field/>标签中引入了(其中的type对应的就是你自己定义的数据类型了):
<field name="roomId" type="string" indexed="true" stored="true"/>
2、直接在<field/>标签中的type定义
<field name="roomId" type="solr.StrField" indexed="true" stored="true"/>
<3>上面两个步骤配置的属性已经能达到储存数据的功能,如果还需要定义更多的功能请参照以下的api介绍的属性,下面给出api:
如果不需要特殊功能的小伙伴,可以直接跳到第二个教程了,在idea中进行CRUD操作:
字段的一般属性:
name
fieldType 的名称。该值用于字段定义中的“类型”属性中。强烈建议名称仅包含字母数字或下划线字符,不能以数字开头。目前这不是严格执行的。
class
用于存储和索引此类型数据的类名。请注意,您可以用 “solr” 作为前缀包含的类名称。Solr 会自动找出哪些软件包可以搜索这个类,这样
solr.TextField
就可以工作了。如果您使用的是第三方类,则可能需要具有完全限定的类名称。
solr.TextField
是的完全限定等效项是org.apache.solr.schema.TextField
。positionIncrementGap
对于多值字段,指定多个值之间的距离,这可以防止虚假词组匹配。
autoGeneratePhraseQueries
对于文本字段。如果为
true
,Solr 将自动生成相邻词语的短语查询。如果为false
,则术语必须用双引号括起来以作为短语处理。enableGraphQueries
对于文本字段,查询时使用sow=false(这是
sow
参数的默认值)。对具有查询分析器的字段类型使用 true (默认值),包括具有图形感知的筛选器,例如同义词图形过滤器和字符分隔符图形过滤器。对于既有查询分析器使用的字段类型,使用 false 包括在缺少某些标记 (例如,Shingle Filter) 时可以匹配文档的筛选器。
docValuesFormat
定义用于此类型的字段的自定义 DocValuesFormat。这要求具有架构感知的编解码器(例如,SchemaCodecFactory 已在 solrconfig.xml 中配置)。
postingsFormat
定义用于此类型的字段的自定义 PostingsFormat。这要求具有架构感知的编解码器(例如,SchemaCodecFactory 已在 solrconfig.xml 中配置)。
Tip:只有默认编解码器支持 Lucene 索引反向兼容。如果您选择在 schema.xml 中自定义 postingsFormat 或 docValuesFormat,则升级到未来版本的 Solr 可能会要求您切换回默认编解码器,并在升级之前优化索引以将其重写为默认编解码器,或升级后从头开始重新构建整个索引。
字段默认属性:
属性 | 描述 | 值 | 隐含默认值 |
---|---|---|---|
索引(indexed) | 如果为 true,则可以在查询中使用该字段的值来检索匹配的文档。 | true 或者 false | true |
存储(stored) | 如果为 true,则字段的实际值可以通过查询来检索。 | true 或者 false | true |
docValues | 如果为 true,则该字段的值将被放入一个面向列的 DocValues 结构中。 | true 或者 false | false |
sortMissingFirst sortMissingLast | 排序字段不存在时控制文档的位置。 | true 或者 false | false |
多值(multiValued) | 如果为 true,则表示单个文档可能包含此字段类型的多个值。 | true 或者 false | false |
omitNorms | 如果为 true,则省略与该字段关联的规范(这将禁用该字段的长度规范化,并保存一些内存)。对于所有基元 (non-analyzed) 字段类型(如 int、float、data、bool 和 string)的默认值均为true。只有全文字段或字段需要规范。 | true 或者 false | * |
omitTermFreqAndPositions | 如果为 true,则省略该字段过帐的术语频率、位置和有效载荷。这可以提高不需要这些信息的字段的性能。这也减少了索引所需的存储空间。依赖于使用此选项在字段上发布的位置的查询将悄然无法找到文档。对于不是文本字段的所有字段类型,此属性默认为 true。 | true 或者 false | * |
omitPositions | 类似于 omitTermFreqAndPositions 但保留了词频信息。 | true 或者 false | * |
termVectors termPositions termOffsets termPayloads | 这些选项指示 Solr 维护每个文档的全部向量矢量,可选地包括这些向量中每个词条出现的位置,偏移和有效载荷信息。这些可以用来加速突出显示和其他辅助功能,但在索引大小方面会带来相当大的成本。对于 Solr 的典型用途,它们不是必需的。 | true 或者 false | false |
需要(required)是否必须 | 指示 Solr 拒绝任何尝试添加一个文件,该文件没有这个字段的值。该属性默认为 false。 | true 或者 false | false |
useDocValuesAsStored | 如果该字段启用了 docValues,将其设置为 true 将允许 stored=false 在 fl 参数中匹配“*”时将该字段作为存储字段返回(即使有)。 | true 或者 false | true |
大(large) | 如果实际值<512KB,大字段总是被延迟加载,并且只占用文档高速缓存中的空间。这个选项需要 stored="true" 和multiValued="false"。它的目的是为了可能有非常大的值,以便他们不被缓存在内存中的字段。 | true 或者 false | false |
数据类型:
solr的数据类型定义在org.apache.solr.schema的包中,我们可以直接用solr. 相对应的数据类型找到对应的数据类型进行定义。
类 | 描述 |
---|---|
BinaryField | 二进制数据。 |
BoolField | 包含 true 或 false。第一个字符中的值:1 ,t 或T 被解释为true ;第一个字符中的任何其他值都被解释为false 。 |
CollationField | 支持排序和范围查询的 Unicode 排序规则。ICUCollationField 是一个更好的选择,如果你可以使用 ICU4J。有关更多信息,请参阅 Unicode 归类部分。 |
CurrencyField | 已弃用。改用 CurrencyFieldType。 |
CurrencyFieldType | 支持货币和汇率。有关更多信息,请参阅使用货币和汇率部分。 |
DateRangeField | 支持索引日期范围,还包括时间点实例(单毫秒(single-millisecond )持续时间)。有关使用此字段类型的更多详细信息,请参阅使用日期部分。请考虑使用这种字段类型,即使它只是用于日期实例,特别是当查询通常在 UTC 年/月/日/小时等边界时。 |
DatePointField | 日期字段。代表精确到毫秒的时间点,使用基于“维度点”的数据结构进行编码,可以非常有效地搜索特定值或值的范围。有关支持的语法的更多详细信息,请参阅使用日期部分。对于单值字段,必须使用 docValues = "true" 来启用排序。 |
DoublePointField | 双字段(64 位 IEEE 浮点)。该类使用基于 “Dimensional Points” 的数据结构对double 值进行编码,从而可以非常有效地搜索特定的值或值的范围。对于单值字段,必须使用 docValues = "true" 来启用排序。 |
ExternalFileField | 从磁盘上的文件中提取值。有关更多信息,请参阅使用外部文件和进程一节。 |
EnumField | 已弃用。改用 EnumFieldType。 |
EnumFieldType | 允许定义枚举的一组值,这些值可能不易按字母或数字顺序(例如,严重性等级列表)排序。这个字段类型需要一个配置文件,它列出了字段值的正确顺序。有关更多信息,请参阅使用枚举字段一节。 |
FloatPointField | 浮点字段(32 位 IEEE 浮点)。该类使用基于“维度点”的数据结构对浮点值进行编码,可以非常有效地搜索特定的值或值的范围。对于单值字段,必须使用 docValues = "true" 来启用排序。 |
ICUCollationField | 支持排序和范围查询的 Unicode 排序规则。有关更多信息,请参阅 Unicode 归类部分。 |
IntPointField | 整数字段(32位有符号整数)。该类使用基于“Dimensional Points”的数据结构对int 值进行编码,可以非常有效地搜索特定值或值的范围。对于单值字段,必须使用 docValues = "true" 来启用排序。 |
LatLonPointSpatialField | 纬度/经度坐标对;可能多值多点。通常用逗号指定为 “lat,lon” 顺序。有关更多信息,请参阅空间搜索部分。 |
LatLonType | 已弃用。请考虑使用 LatLonPointSpatialField 来代替。一个单值的纬度/经度坐标对。通常用逗号指定为 “lat,lon” 顺序。有关更多信息,请参阅空间搜索部分。 |
LongPointField | 长字段(64 位有符号整数)。该类使用基于 “Dimensional Points” 的数据结构对foo 值进行编码,从而可以非常有效地搜索特定值或值的范围。对于单值字段,必须使用 docValues = "true" 来启用排序。 |
PointType | 一个单值的 n 维点。它既用于排序不是经纬度的空间数据,也用于一些更罕见的用例。(注:这与基于 "Point" 的数值字段无关)。请参阅空间搜索以获取更多信息。 |
PreAnalyzedField | 提供一种发送到 Solr 序列化标记流的方法,可选地具有独立存储的字段值,并且在没有任何额外的文本处理的情况下存储和索引这些信息。PreAnalyzedField 的配置和用法在“使用外部文件和进程”一节中有介绍。 |
RandomSortField | 不包含值。对此字段类型进行排序的查询将以随机顺序返回结果。使用动态字段来使用此功能。 |
SpatialRecursivePrefixTreeFieldType | (简称 RPT)接受纬度逗号经度字符串或 WKT 格式的其他形状。请参阅空间搜索以获取更多信息。 |
StrField | 字符串(UTF-8 编码的字符串或 Unicode)。字符串用于小型字段,不以任何方式标记或分析。他们有一个不到 32K 的硬限制。 |
TextField | 文本,通常是多个单词或标记。 |
TrieDateField | 已弃用。改用 DatePointField。 |
TrieDoubleField | 已弃用。改用 DoublePointField。 |
TrieFloatField | 已弃用。改用 FloatPointField。 |
TrieIntField | 已弃用。改用 IntPointField。 |
TrieLongField | 已弃用。改用 LongPointField。 |
TrieField | 已弃用。这个字段用一个 type 参数来定义要使用的 Trie * 字段的特定类;改为使用适当的“Point Field”类型。 |
UUIDField | 通用唯一标识符(UUID)。通过 NEW 值, Solr 将创建一个新的 UUID。注意:NEW 在使用 SolrCloud 时,配置一个默认值为 UUIDField 的实例对于大多数用户是不可取的(因为结果将是每个文档的每个副本将得到一个唯一的 UUID值。建议使用 UUIDUpdateProcessorFactory 在添加文档时生成 UUID 值。 |