至少在 Schema API 的 6.6 版本和它的当前版本 7.5 中,您可以在单个帖子中传递多个命令(分别参见 6.6 和 7.5 文档)。有多种可接受的格式,但最直观的一种(我认为)只是为您要执行的操作传递一个数组:
curl -X POST -H 'Content-type: application/json' -d '{
"delete-field": [
{"name": "trans"},
{"name": "other_field"}
]
}' 'http://arteika:8983/solr/trans/schema'
所以。我们如何获取要删除的字段的名称?这可以通过查询 Schema 来完成:
curl -X GET -H 'Content-type: application/json' 'http://arteika:8983/solr/trans/schema'
尤其是响应中schema 对象中的copyFields、dynamicFields 和fields 键。
我自动清除所有复制字段规则、动态字段规则和字段如下。您当然可以使用任何可用的脚本。我使用了 Python 3(可能适用于 Python 2,我没有测试过)。
import json
import requests
# load schema information
api = 'http://arteika:8983/solr/trans/schema'
r = requests.get(api)
# delete copy field rules
names = [(o['source'], o['dest']) for o in r.json()['schema']['copyFields']]
payload = {'delete-copy-field': [{'source': name[0], 'dest': name[1]} for name in names]}
requests.post(api, data = json.dumps(payload),
headers = {'Content-type': 'application/json'})
# delete dynamic fields
names = [o['name'] for o in r.json()['schema']['dynamicFields']]
payload = {'delete-dynamic-field': [{'name': name} for name in names]}
requests.post(api, data = json.dumps(payload),
headers = {'Content-type': 'application/json'})
# delete fields
names = [o['name'] for o in r.json()['schema']['fields']]
payload = {'delete-field': [{'name': name} for name in names]}
requests.post(api, data = json.dumps(payload),
headers = {'Content-type': 'application/json'})
请注意:我最初收到状态 400 响应,带有 null 错误消息。弄清楚如何解决这些问题有点困难,所以我正在分享对我有用的东西。将solrconfig.xml 中的updateRequestProcessorChain 的默认值更改为false (default="${update.autoCreateFields:false}") 并重新启动Solr 服务使这些错误对我来说消失了。我正在删除的字段是自动创建的,这可能与此有关。