1 Documents, Fields, and Schema Design

1.1 Overview

1.1.1 原理简介

  • feed in (indexing or updating)
  • ask questions (query)

1.1.2 Field Analysis

告诉solr如何处理字段,如需要忽略的字段与转换形式(a,the,an,Running=>run)

1.1.3 Schema File

告诉solr如何对输入的文档简历索引

  • 默认为*managed-schema*文件
  • Cloud模式没有此文件,只能通过api或者cloud-ui看到
  • api方式修改只能修改*managed schema*指定的文件
  • solrCloud不通过api方式修改schema只能通过 upconfig 和 downconfg 让ZooKeeper管理配置文件

1.2 Schema Detail

server/

1.2.1 Solr Field Types

  1. TODO Field Type Definitions and Properties(完善属性定义)
    1. 字段类型定义可以包含四种类型
      • name 必须
      • class 必须
      • 如果字段类型是TextField,可以加上对field analysis
      • 字段类型的属性,取决于class
    2. 类型定义
      • 放在fieldType标签中
      • 可以用type标签分组
    3. Field Type Properties
      • <fieldType name="date" class="solr.TrieDateField" sortMissingLast="true" omitNorms="true"/>
      • 属性被分成三种
        1. 针对field type的class的属性
        2. 常规属性
          • name
          • class
          • positionIncrementGap (对multivalue field 处理时,给两个field的词人为加上distance)
          • autoGeneratePhraseQueries
          • docValuesFormat (docValues的格式)
          • postingsFormat
        3. 字段默认属性(替换继承的默认属性)
          • indexed (是否建立索引)
          • stored (是否存储内容)
          • docValues ( 可以提升如排序,分面,高亮的性能)
          • sortMissingFirst/sortMissingLast
          • multiValued (多值)
    4. 例子:
    &lt;fieldType name="ancestor_path" class="solr.TextField"&gt;
      &lt;analyzer type="index"&gt;
        &lt;tokenizer class="solr.KeywordTokenizerFactory"/&gt;
      &lt;/analyzer&gt;
      &lt;analyzer type="query"&gt;
        &lt;tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/"/&gt;
      &lt;/analyzer&gt;
    &lt;/fieldType&gt;
  2. TODO Field Types Included with Solr
  3. TODO Working with Currencies and Exchange Rates
  4. FEEDBACK Working with Dates
    1. 时间格式

      YYYY-MM-DDThh:mm:ssZ

      • Z 表示日期为 UTC
      • 没有时区
      • 只能精确到毫秒
      • 1972-05-20T17:33:18Z 日期和年份中间必须要有 - 分割
      • 冒号有时需要转义,下面十几个正确的表达式: datefield:1972-05-20T17\:33\:18.772Z

        datefield:"1972-05-20T17:33:18.772Z"

        datefield:[1972-05-20 六]

      1. 时间范围的格式
        • 2000-11 十一月
        • 2000-11T13 与上个大致相同,但是表示的是 13 点这一个小时
        • -0009 公元前 10 年,公元 0 年代表公元前 1 年
        • [2000-11-01 三] 日期粒度的时间间隔
        • [2014 TO 2014-12-01] 从 2014 年开始的一天到 12 月 01 日
        • [* TO 2014-12-01] 从最早的时间到指定时间
        • 限制: 范围语法不支持数学运算
    2. 时间运算
      1. 对现有时间的加减运算
        • NOW+2MONTHS 从现在开始的两个月
        • NOW-1DAY 昨天
      2. 对现有时间指定单位的舍入
        • NOW/HOUR 对现在时间舍入,取当前小时的开始那一个时间点
        • NOW+6MONTHS+3DAYS/DAY 取 6 个月 3 天之后的那天的最开始
  5. TODO Working with Enum Fields
  6. TODO Working with External Files and Processes

1.2.2 Defining Fields

  1. example
    • <field name="price" type="float" default="0.0" indexed="true" stored="true"/>
  2. Field Properties
    • name (must)
    • type (must)
    • default (optional)
  3. TODO Optional Field Type Override Properties

    会覆盖掉 fieldType 属性的属性

1.2.3 Copying Fields

  • 为一个数据应用多种不同的字段类型
  • 需要搜索多个字段, 可以通过*copyField*组成一个字段,然后配置成默认搜索此字段。
  • 使用*copyField*会造成索引数据的增长
  • source和dest开头或者结尾可以有*表示匹配所有(表示通配符)
  1. 主要字段
    • source 被复制的字段名称
    • dest 复制到的名称
    • maxChars 限制从source最多复制的字符 (想要控制index大小时有用)
  2. example
    &lt;copyField source="cat" dest="text" maxChars="30000" /&gt;
    &lt;copyField source="*_t" dest="text" maxChars="25000" /&gt;

    如果text中有数据,那么cat中的内容将会添加到text中。

    如果dest的source是多个值组成的,或者dest有多个source需要把dest字段设置成multivalued="true"

    &lt;schema name="eshequn.post.db_post.0" version="1.1" xmlns:xi="http://www.w3.org/2001/XInclude"&gt;  
    &lt;fields&gt;
    &lt;field name="title" type="text" indexed="true" stored="false" /&gt;
    &lt;field name="content" type="text" indexed="true" stored="false" /&gt;
    &lt;field name="tc" type="text" indexed="true" stored="false" multiValued="true"/&gt;
    &lt;/fields&gt;
    &lt;copyField source="title" dest="tc" /&gt;
    &lt;copyField source="content" dest="tc" /&gt;
    &lt;
    /schema&gt;

1.2.4 Dynamic Fields

顾名思义,动态字段。

&lt;dynamicField name="*_i" type="int" indexed="true" stored="true"/&gt;

1.2.5 Other Elements

  1. Unique Key

    指定文档的唯一标志(更新文档的时候有用)

  2. Default Search Field & Query Operator
    • <defaultSearchField/> 已经被df参数取代
    • <solrQueryParserdefaultOperator="OR"/> 被q.op取代
  3. Similarity

    用来在搜索时获取文档的相关度(score)。自定义评分器。

    • 每个文档只能有一个全局的Similarity
    • 默认行为BM25SimilarityFactory
    • 通过<similarity/> 标签可以覆盖默认行为
    • 可以通过两种形式实现
    &lt;similarity class="solr.BM25SimilarityFactory"/&gt;
    &lt;similarity class="solr.DFRSimilarityFactory"&gt;
    &lt;str name="basicModel"&gt;P&lt;/str&gt;
    &lt;str name="afterEffect"&gt;L&lt;/str&gt;
    &lt;str name="normalization"&gt;H2&lt;/str&gt;
    &lt;float name="c"&gt;7&lt;/float&gt;
    &lt;/similarity&gt;

1.2.6 Schema API

提供一种通过http请求来读取和修改schema的方式

  • schema修改之后只会改变后来的文档索引形式,不会改变之前的索引文档。所以必须重新索引所有的文档
  • output format: json | xml
  • http://<host>:<port>/solr/<collection_name>/schema/
  1. API Entry Points
    • /schema: retrieve the schema, or modify the schema to add, remove, or replace fields, dynamic fields, copy fields, or field types
    • /schema/fields: retrieve information about all defined fields or a specific named field
    • /schema/dynamicfields: retrieve information about all dynamic field rules or a specific named dynamic rule
    • /schema/fieldtypes: retrieve information about all field types or a specific field type
    • /schema/copyfields: retrieve information about copy fields
    • /schema/name: retrieve the schema name
    • /schema/version: retrieve the schema version
    • /schema/uniquekey: retrieve the defined uniqueKey
    • /schema/similarity: retrieve the global similarity definition
    • /schema/solrqueryparser/defaultoperator: retrieve the default operator
  2. Modify the Schema
    curl -X POST -H 'Content-type:application/json' --data-binary '{
        "add-field":{ "name":"sell-by", "type":"tdate", "stored":true } 
    }' http://localhost:8983/solr/gettingstarted/schema
    
    1. Schema Changes among Replicas

      在一个复制集上做的更改会改到其他的复制集上面

  3. Retrieve Schema Information
    curl http://localhost:8983/solr/gettingstarted/schema?wt=json
    curl http://localhost:8983/solr/gettingstarted/schema?wt=xml
    curl http://localhost:8983/solr/gettingstarted/schema?wt=schema.xml
    curl http://localhost:8983/solr/gettingstarted/schema/fields?wt=json[fl=string,string
    &includeDynamic=bool&showDefaults=bool]
    

1.2.7 Putting the Pieces Together

  1. Choosing Appropriate Numeric Types
    1. 一般情况下 使用
      • TrieIntField
      • TrieLongField
      • TrieFloatField
      • TrieDoubleFiel
      • precisionStep="0"
    2. 数字经常被指定范围
      • precisionStep="8"
  2. Working With Text
    1. 通过使用一个txt field将所有字段汇总成一个搜索(用到了copyField)
    2. 通过copyField将一个字段作为不同的用处
  3. DocValues
    • 传统的index是一种倒排索引并且是term-to-document的list,对于使用term来搜索时,这种方式很快
    • 但是若是使用facet、sort、hightlight这些特性,就会很慢
    • docvalues 是一种 面向列 的字段索引方式,并且使用了document-to-value的list
    • indexed 和 docValues 只能指定一个为true
    • 只能开启以下几个类型的docValues
      1. StrField
      2. UUIDField
      3. Trie* numeric fields
      4. date
      5. EnumField
  4. TODO Using DocValues
  5. TODO Schemaless Mode
Last Updated 2017-04-07 五 22:32.
Render by hexo-renderer-org with Emacs 25.1.1 (Org mode 9.0.2)