• 修改模式
    • 添加新字段">添加新字段
    • 删除字段">删除字段
    • 替换字段">替换字段
    • 添加动态字段规则">添加动态字段规则
    • 删除动态字段规则">删除动态字段规则
    • 替换动态字段规则">替换动态字段规则
    • 添加新字段类型">添加新字段类型
    • 删除字段类型">删除字段类型
    • 替换字段类型">替换字段类型
    • 添加新拷贝字段规则">添加新拷贝字段规则
    • 删除拷贝字段规则">删除拷贝字段规则
    • 单个 POST 中的多个命令
    • 跨副本的模式变更

    修改模式

    POST /collection/schema

    要添加、删除或替换字段、动态字段规则、拷贝字段规则或新字段类型, 你可以给 /collection/schema 终端发生一个带有一系列命令的 POST 请求来执行所请求动作。 它支持以下命令:

    这些命令可以在独立的 POST 请求中分别发送,也可以放在一个 POST 请求中。 命令以它们被指定的顺序进行执行。

    每次使用时,响应中会包含请求处理的状态和时间,但不会包含整个的模式。

    当以该 API 修改模式时,将自动触发 core 的重加载以使其变更对后续待索引文档立即可用。 以前索引的文档将 会被自动处理 - 它们 必需 在其使用的模式元素变更时被重新索引。

    添加新字段

    add-field 命令可给你的模式添加新的字段定义。若已存在同名字段将抛出一个错误。

    所有在手动编辑 schema.xml 定义字段时可用的属性都可以传给该 API。 这些请求属性在 定义字段 中有详细描述。

    如,要定义一个名为 “sell-by” 的类型为 “tdate” 的存储字段,你可以 POST 以下请求:

    1. curl -X POST -H 'Content-type:application/json' --data-binary '{
    2. "add-field":{
    3. "name":"sell-by",
    4. "type":"tdate",
    5. "stored":true }
    6. }' http://localhost:8983/solr/gettingstarted/schema

    删除字段

    delete-field 命令可从模式中删除某个字段定义。 若模式中不存在该字段或该字段是某个拷贝字段规则的来源或目标时,将抛出一个错误。

    如,要删除名为 “sell-by” 的字段,你可以 POST 以下请求:

    1. curl -X POST -H 'Content-type:application/json' --data-binary '{
    2. "delete-field" : { "name":"sell-by" }
    3. }' http://localhost:8983/solr/gettingstarted/schema

    替换字段

    replace-field 命令可替换某个字段定义。 注意你需要提供该字段的完整定义 - 该命令 不会 部分地修改字段定义。 若该字段在模式中不存在,将抛出一个错误。

    所有在手动编辑 schema.xml 定义字段时可用的属性都可以传给该 API。 这些请求属性在 定义字段 中有详细描述。

    如,要替换某个已有的名为 “sell-by” 的字段定义,使其类型改为 “date” 并为非存储的, 你可以发送以下 POST 请求:

    1. curl -X POST -H 'Content-type:application/json' --data-binary '{
    2. "replace-field":{
    3. "name":"sell-by",
    4. "type":"date",
    5. "stored":false }
    6. }' http://localhost:8983/solr/gettingstarted/schema

    添加动态字段规则

    add-dynamic-field 命令可在模式中添加新的动态字段规则。

    所有在手动编辑 schema.xml 定义字段时可用的属性都可以传给该 API。 这些可用于定义在动态字段规则上属性在 动态字段 中有详细描述。

    如,要创建一个新的动态字段规则使得所有输入的以 “_s” 结尾的字段都将是存储的且具有字段类型 “string”, 你可以发送如下 POST 请求:

    1. curl -X POST -H 'Content-type:application/json' --data-binary '{
    2. "add-dynamic-field":{
    3. "name":"*_s",
    4. "type":"string",
    5. "stored":true }
    6. }' http://localhost:8983/solr/gettingstarted/schema

    删除动态字段规则

    delete-dynamic-field 命令可用于从模式中删除某个动态字段规则。 若该动态字段规则在模式中不存在,或者模式中包含了一条具有仅匹配该动态字段规则的目标的拷贝字段规则, 将抛出一个错误。

    如,要删除匹配 “*_s” 的动态字段规则,你可以 POST 以下请求:

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

    替换动态字段规则

    replace-dynamic-field 命令可用于替换模式中的动态字段规则。 注意你需要提供该动态字段规则的完整定义 - 该命令 不会 部分地修改动态字段规则定义。 若该动态字段规则在模式中不存在,将抛出一个错误。

    所有在手动编辑 schema.xml 定义字段时可用的属性都可以传给该 API。 这些可用于定义在动态字段规则上属性在 动态字段 中有详细描述。

    如,要将 “*_s” 动态字段规则替换为字段类型为 “text_general” 且非存储的规则, 你可以发送以下 POST 请求:

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

    添加新字段类型

    add-field-type 命令可给模式添加新的字段类型。

    所有在手动编辑 schema.xml 定义字段类型时可用的属性都可以传给该 API。 该命令的结构为一个 标准字段类型定义的 json 映射,包括了 name、class、index 和 query analyzer 定义等。 这些选项在 Solr 字段类型 中有详细描述。

    如,要创建一个名为 “myNewTxtField” 的字段类型,你可以 POST 如下请求:

    1. curl -X POST -H 'Content-type:application/json' --data-binary '{
    2. "add-field-type" : {
    3. "name":"myNewTxtField",
    4. "class":"solr.TextField",
    5. "positionIncrementGap":"100",
    6. "analyzer" : {
    7. "charFilters":[{
    8. "class":"solr.PatternReplaceCharFilterFactory",
    9. "replacement":"$1$1",
    10. "pattern":"([a-zA-Z])\\\\1+" }],
    11. "tokenizer":{
    12. "class":"solr.WhitespaceTokenizerFactory" },
    13. "filters":[{
    14. "class":"solr.WordDelimiterFilterFactory",
    15. "preserveOriginal":"0" }]}}
    16. }' http://localhost:8983/solr/gettingstarted/schema

    注意本例中我们仅定义了单个解析器部分,它将应用于索引分析和查询分析中。 若我们希望定义独立的分析,我们可以替换上述的 analyzer 部分 为独立的 indexAnalyzerqueryAnalyzer 两部分,如:

    1. curl -X POST -H 'Content-type:application/json' --data-binary '{
    2. "add-field-type":{
    3. "name":"myNewTextField",
    4. "class":"solr.TextField",
    5. "indexAnalyzer":{
    6. "tokenizer":{
    7. "class":"solr.PathHierarchyTokenizerFactory",
    8. "delimiter":"/" }},
    9. "queryAnalyzer":{
    10. "tokenizer":{
    11. "class":"solr.KeywordTokenizerFactory" }}}
    12. }' http://localhost:8983/solr/gettingstarted/schema

    删除字段类型

    delete-field-type 命令可从模式中移除某个字段类型。 若该字段类型在模式中不存在,或模式中任何字段或动态字段规则使用了该字段类型,将抛出一个错误。

    如,要删除名为 “myNewTxtField” 的字段类型,你可以发送如下 POST 请求:

    1. curl -X POST -H 'Content-type:application/json' --data-binary '{
    2. "delete-field-type":{ "name":"myNewTxtField" }
    3. }' http://localhost:8983/solr/gettingstarted/schema

    替换字段类型

    replace-field-type 命令可用于替换模式中的字段类型。 注意你需要提供该字段类型的完整定义 - 该命令 不会 部分地修改字段类型定义。 若该字段类型在模式中不存在,将抛出一个错误。

    所有在手动编辑 schema.xml 定义字段类型时可用的属性都可以传给该 API。 该命令的结构为一个 标准字段类型定义的 json 映射,包括了 name、class、index 和 query analyzer 定义等。 这些选项在 Solr 字段类型 中有详细描述。

    如,要替换名为 “myNewTxtField” 的字段类型,你可以发送如下 POST 请求:

    1. curl -X POST -H 'Content-type:application/json' --data-binary '{
    2. "replace-field-type":{
    3. "name":"myNewTxtField",
    4. "class":"solr.TextField",
    5. "positionIncrementGap":"100",
    6. "analyzer":{
    7. "tokenizer":{
    8. "class":"solr.StandardTokenizerFactory" }}}
    9. }' http://localhost:8983/solr/gettingstarted/schema

    添加新拷贝字段规则

    add-copy-field 命令可给模式添加新的拷贝字段规则。

    该命令支持的属性和在手动编辑 schema.xml 以创建拷贝字段类型规则相同,如下:

    |名称 |必需|描述 | |source |是 |源字段 | |dest |是 |源字段将被拷贝至的某个字段或一个字段的数组 | |maxChars|否 |被拷贝的字符数量上限。小节 拷贝字段 中有更多信息 |

    如,要定义将字段 “shelf” 拷贝至 “location” 和 “catchall” 字段,可以发送以下 POST 请求:

    1. curl -X POST -H 'Content-type:application/json' --data-binary '{
    2. "add-copy-field":{
    3. "source":"shelf",
    4. "dest":[ "location", "catchall" ]}
    5. }' http://localhost:8983/solr/gettingstarted/schema

    删除拷贝字段规则

    delete-copy-field 命令可从模式中删除某个拷贝字段规则。 若该拷贝字段规则在模式中不存在,则抛出一个错误。

    该命令中 sourcedest 属性是必需的。

    如,要删除拷贝字段 “shelf” 到 “location” 字段的规则,可以发送以下 POST 请求:

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

    单个 POST 中的多个命令

    可以在单个请求中执行一或多个添加请求。 该 API 是事务性的,所有单次调用的命令要么同时成功或者失败。

    这些命令以其被指定的顺序执行。这意味着如果你想创建一个新的字段类型且在相同的请求中 对某个新的字段使用该字段类型,则创建字段类型的请求部分将出现在创建字段的命令之前。 类似的,因为用在拷贝字段规则中的字段必须存在,添加该字段的命令必须在其用作拷贝源或目标 的拷贝字段规则之前。

    发起多个命令的请求支持多种方式。 第一种,命令可以简单地是顺序的,如下请求创建了一个新的字段类型,随后的字段中使用了该类型:

    1. curl -X POST -H 'Content-type:application/json' --data-binary '{
    2. "add-field-type":{
    3. "name":"myNewTxtField",
    4. "class":"solr.TextField",
    5. "positionIncrementGap":"100",
    6. "analyzer":{
    7. "charFilters":[{
    8. "class":"solr.PatternReplaceCharFilterFactory",
    9. "replacement":"$1$1",
    10. "pattern":"([a-zA-Z])\\\\1+" }],
    11. "tokenizer":{
    12. "class":"solr.WhitespaceTokenizerFactory" },
    13. "filters":[{
    14. "class":"solr.WordDelimiterFilterFactory",
    15. "preserveOriginal":"0" }]}},
    16. "add-field" : {
    17. "name":"sell-by",
    18. "type":"myNewTxtField",
    19. "stored":true }
    20. }' http://localhost:8983/solr/gettingstarted/schema

    或者,相同的命令可以被重复,如下:

    1. curl -X POST -H 'Content-type:application/json' --data-binary '{
    2. "add-field":{
    3. "name":"shelf",
    4. "type":"myNewTxtField",
    5. "stored":true },
    6. "add-field":{
    7. "name":"location",
    8. "type":"myNewTxtField",
    9. "stored":true },
    10. "add-copy-field":{
    11. "source":"shelf",
    12. "dest":[ "location", "catchall" ]}
    13. }' http://localhost:8983/solr/gettingstarted/schema

    最后,重复的命令可以以数组发送:

    1. curl -X POST -H 'Content-type:application/json' --data-binary '{
    2. "add-field":[
    3. { "name":"shelf",
    4. "type":"myNewTxtField",
    5. "stored":true },
    6. { "name":"location",
    7. "type":"myNewTxtField",
    8. "stored":true }]
    9. }' http://localhost:8983/solr/gettingstarted/schema

    跨副本的模式变更

    当运行在 SolrCloud 模式时,对一个节点上模式的变更将会传播给集合的所有副本。 你可以在请求中传递 updateTimeoutSecs 参数来设置在所有副本都确认它们应用了模式变更的等待的秒数。 这能帮助你的客户端应用更加健壮,你能够确保所有的副本在给定时间内都有给定的模式变更。 若在指定时间内没有达成所有副本的同意,则请求失败且错误消息中会包含那些副本存在问题的信息。 大多数时候,仅有的选择是在等待简短的时间后进行重试。 若问题还存在,你可能需要检查应用变更存在问题的副本上的服务器日志。 若你没有提供 updateTimeoutSecs 参数,默认行为是对接收节点在将变更持久化到 ZooKeeper 后立即返回。 所有其他副本将异步的应用更新。因此,没有提供超时时间时,你的客户端应用不能确保所有副本都应用了该变更。