• solr(三、schema)


    本文属性等介绍借鉴了以下博客和文章:

    https://blog.csdn.net/supermao1013/article/details/83628344

    https://www.w3cschool.cn/solr_doc/solr_doc-jmqv2fzk.html

    Schema:模式,是集合/内核中字段的定义,让solr知道集合/内核包含哪些字段、字段的数据类型、字段该索引存储。在solr高版本中,在managed-schema文件中配置。

    在这里要强调一下,单机模式的schema文件保存在每个内核的conf文件夹下面。而solrCloud模式是配置在zookeeper里,并没有找到文件

    managed-schema详解

    文件结构 

    <?xml version="1.0" encoding="UTF-8" ?>
    <schema version="1.6">
        <field .../>  
        <dynamicField .../>
        <uniqueKey>id</uniqueKey>
        <copyField .../>
        <fieldType ...>
            <analyzer type="index">
                <tokenizer .../>
                <filter ... />
            </analyzer>
            <analyzer type="query">
                <tokenizer.../>
                <filter ... />
            </analyzer>
        </fieldType>
    </schema>

    field

    <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
    <field name="_version_" type="plong" indexed="false" stored="false"/>
    <field name="_root_" type="string" indexed="true" stored="false" docValues="false" />
    <field name="_nest_path_" type="_nest_path_" />
    <field name="_text_" type="text_general" indexed="true" stored="false" multiValued="true"/>

    必填属性

    属性 描述

    字段名(name)

    字段名,必需。字段名可以由字母、数字、下划线构成,不能以数字开头。以下划线开头和结尾的名字为保留字段名,如 version

    名称 

    fieldType属性(type)

    字段的fieldType名,必需。为 FieldType标签中定义的name属性值。

    fieldType

    可选属性

    属性描述 隐含默认值

    默认值(default)

    如果提交的文档中没有该字段的值,则自动会为文档添加这个默认值。相当于传统数据库中的字段默认值。

    true 或者 false 

    false 

    索引(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

    fieldType

    作用:定义在索引时该如何分词、索引、存储字段,在查询时该如何对查询串分词

        <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
          <analyzer type="index">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
            <filter class="solr.LowerCaseFilterFactory"/>
          </analyzer>
          <analyzer type="query">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
            <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
            <filter class="solr.LowerCaseFilterFactory"/>
          </analyzer>
        </fieldType>

    name:字段类型名称,用于Field定义中的type属性引用
    class:存放该类型的值来进行索引的字段类名(同lucene中Field的子类)。注意,应以 *solr.*为前缀,这样solr就可以很快定位到该到哪个包中去查找类,如 solr.TextField 。如果使用的是第三方包的类,则需要用全限定名。solr.TextField 的全限定名为:org.apache.solr.schema.TextField。
    positionIncrementGap:用于多值字段,定义多值间的间隔,来阻止假的短语匹配
    autoGeneratePhraseQueries:用于文本字段,如果设为true,solr会自动对该字段的查询生成短语查询,即使搜索文本没带“”
    synonymQueryStyle:同义词查询分值计算方式
    enableGraphQueries:是否支持图表查询
    docValuesFormat:docValues字段的存储格式化器:schema-aware codec,配置在solrconfig.xml中的
    postingsFormat:词条格式器:schema-aware codec,配置在solrconfig.xml中的

    class

    solr字段类型

    描述

    BinaryField

    二进制数据。

    BoolField

    包含 true 或 false。第一个字符中的值:1tT被解释为true;第一个字符中的任何其他值都被解释为false

    Collat​​ionField

    支持排序和范围查询的 Unicode 排序规则。ICUCollat​​ionField 是一个更好的选择,如果你可以使用 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" 来启用排序。

    ICUCollat​​ionField

    支持排序和范围查询的 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 值。

    analyzer(分析器)

    在正常使用情况下,只有类型为 solr.TextField 的字段将指定一个分析器。

    第一种方式:配置分析器的最简单的方法是使用单个 <analyzer> 元素,它的类属性是一个完全限定的Java 类名。命名的类必须派生自 org.apache.lucene.analysis.Analyzer。例如:

    <fieldType name="nametext" class="solr.TextField">
      <analyzer class="org.apache.lucene.analysis.core.WhitespaceAnalyzer"/>
    </fieldType>

    第二种方式:灵活组合标记器(分词器)和过滤器:

    <fieldType name="nametext" class="solr.TextField">
      <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StandardFilterFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.StopFilterFactory"/>
      </analyzer>
    </fieldType>

    tokenizer(标记器/分词器)

    tokenizer 负责将字段数据分解为词法单位或标记。

    https://www.w3cschool.cn/solr_doc/solr_doc-z4un2g9e.html

    这个地址讲解的很完整

    filter(过滤器)

    过滤器定义应遵循 tokenizer 或其他过滤器定义

    https://www.w3cschool.cn/solr_doc/solr_doc-dcwb2g9n.html

    dynamicField 动态字段

    若定义字段较多,可定义一个规则,通过前缀或后缀通配符*表示

    <dynamicField name="*_txt_ja" type="text_ja"  indexed="true"  stored="true"/>

    copyField 复制字段

    将 cat 字段复制到一个名为 text 的字段中

    <copyField source="cat" dest="text" maxChars="30000" />

    将_t为后缀的字段复制到text字段中

    <copyField source="*_t" dest="text" maxChars="25000" />

    uniqueKey 唯一键

    指定用作唯一的字段,一般用作业务主键

     schemaAPI

    单机模式下的solr部署是可以在内核的conf下找到managed-schema文件的,在里面做了修改后,去管理平台reload就可以生效了。

    但是在集群模式下,却怎么都没有找到managed-schema文件,经过查看solr官方文档,发现了可以通过schemaAPI的方式对集群的schema进行修改。

    参考地址:https://www.w3cschool.cn/solr_doc/solr_doc-8v5b2g40.html

    如:新增一个fieldType,则

    linux下执行:

    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/solr/gettingstarted/schema
    gettingstarted为你的核心名称
    也可使用postman等工具用post方式调用接口:

     这样就做到了对集群schema的修改,如果还有其他更好的办法,欢迎大佬交流。

  • 相关阅读:
    【正则表达式】正则表达式基础语法
    【JavaWeb】实现二级联动菜单
    【JavaWeb】jQuery对Ajax的支持
    MySQL复习值代码知识点(2)
    easyUI+servlet+mysql项目总结
    Android环境配置(Eclipse全开发环境下载)
    jsp+servlet+mysql简单实现用户登陆注册
    java的异常抛出throws和throw的简单使用
    关于Java的多线程Runnable的个人理解(基础,不讲概念)
    Eclipse中代码自动添加注释及代码注释模板
  • 原文地址:https://www.cnblogs.com/Unlimited-Blade-Works/p/12457046.html
Copyright © 2020-2023  润新知