Jest为 elasticsearch提供了出色的异步 API,我们发现它非常有用。然而,有时结果表明产生的请求与我们预期的略有不同。
通常我们不在乎,因为一切正常,但在这种情况下并非如此。
我想使用自定义 ngram 分析器创建索引。当我按照 elasticsearch rest API 文档执行此操作时,我在下面调用:
curl -XPUT 'localhost:9200/test' --data '
{
"settings": {
"number_of_shards": 3,
"analysis": {
"filter": {
"keyword_search": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 15
}
},
"analyzer": {
"keyword": {
"type": "custom",
"tokenizer": "whitespace",
"filter": [
"lowercase",
"keyword_search"
]
}
}
}
}
}'
然后我确认分析仪配置正确:
curl -XGET 'localhost:9200/test/_analyze?analyzer=keyword&text=Expecting many tokens
作为回应,我收到了多个令牌,例如exp、expe、expec等。
现在使用 Jest 客户端,我将配置 json 放到我的类路径上的一个文件中,内容与上面的 PUT 请求的正文完全相同。我执行这样构造的 Jest 动作:
new CreateIndex.Builder(name)
.settings(
ImmutableSettings.builder()
.loadFromClasspath(
"settings.json"
).build().getAsMap()
).build();
结果
Primo - 使用 tcpdump 检查实际发布到 elasticsearch 的内容是(打印得很漂亮):
{ "settings.analysis.filter.keyword_search.max_gram": "15", "settings.analysis.filter.keyword_search.min_gram": "3", "settings.analysis.analyzer.keyword.tokenizer": "whitespace", "settings.analysis.filter.keyword_search.type": "edge_ngram", "settings.number_of_shards": "3", "settings.analysis.analyzer.keyword.filter.0": "lowercase", "settings.analysis.analyzer.keyword.filter.1": "keyword_search", "settings.analysis.analyzer.keyword.type": "custom" }
Secundo - 生成的索引设置为:
{ "test": { "settings": { "index": { "settings": { "analysis": { "filter": { "keyword_search": { "type": "edge_ngram", "min_gram": "3", "max_gram": "15" } }, "analyzer": { "keyword": { "filter": [ "lowercase", "keyword_search" ], "type": "custom", "tokenizer": "whitespace" } } }, "number_of_shards": "3" <-- the only difference from the one created with rest call }, "number_of_shards": "3", "number_of_replicas": "0", "version": {"created": "1030499"}, "uuid": "Glqf6FMuTWG5EH2jarVRWA" } } } }
Tertio - 检查分析仪,
curl -XGET 'localhost:9200/test/_analyze?analyzer=keyword&text=Expecting many tokens
我只得到一个令牌!
问题 1. Jest 没有发布我的原始设置 json 而是一些处理的原因是什么?
问题 2.为什么 Jest 生成的设置不起作用?