我正在使用来自Java的当前ES 2.3.4,并且对我的错误保持沉默。追查问题的原因非常困难。使ElasticSearch在配置错误时失败
问题:如何将ES配置为非宽松,并提前失败,而不是尝试做魔法?
案例1:创建与Java API
正确的例子是在Define custom ElasticSearch Analyzer using Java API的答案,How to add analyzer settings in ElasticSearch?
不幸的是,我有analysis
围绕附加settings
对象的索引在第二个环节的问题。
运行prepareCreate()不介意,没有错误,只是确认。
情况2:参照在映射分析器不存在
进行prepareCreate同一呼叫()我定义我mappings
。我定义了field("analyzer", "myanalyzer")
哪个不存在(因为对象的装箱是错误的)并且它不介意。
我终于明白它的方法是运行一个带有显式QueryBuilders.matchQuery(“myfield”,myvalue).analyzer(“myanalyzer”)的prepareSearch()
,并且它抱怨说没有这样的分析器。
更新1
我仍然感到困惑关于settings
部分。此示例https://www.elastic.co/guide/en/elasticsearch/guide/current/ngrams-compound-words.html使用settings
部分作为mappings
部分的同级,并且不直接从analysis
部分开始。
所以我做在Java中一样,这里是我的确切代码:
xContentBuilder = XContentFactory.jsonBuilder().prettyPrint()
.startObject() //root
.startObject("settings")
.startObject("analysis")
.startObject("filter")
.startObject("trigrams_filter").field("type", "ngram").field("min_gram", "3").field("max_gram", "3").endObject()
.endObject() //filter
.startObject("analyzer")
.startObject("trigrams")
.field("type", "custom")
.field("tokenizer", "standard")
.field("filter", new String[]{"lowercase", "trigrams_filter"})
.endObject()
.endObject() //analyzer
.endObject() //settings
.startObject("mappings")
.startObject(typeName)
.startObject("properties")
.startObject("myfield1").field("type", "string").field("analyzer", "trigrams").endObject()
.endObject() //properties
.endObject() //typeName
.endObject() //mappings
.endObject(); //root
我创作的新鲜指数,并没有失败的回调,没有中止:
ListenableActionFuture<CreateIndexResponse> execute = this.node.client().admin().indices().prepareCreate(indexName)
.setSettings(xContentBuilder)
.execute();
execute.addListener(new ActionListener<CreateIndexResponse>() {
@Override
public void onResponse(CreateIndexResponse createIndexResponse) {
System.out.println(createIndexResponse);
}
@Override
public void onFailure(Throwable e) {
e.printStackTrace();
}
});
CreateIndexResponse createIndexResponse = execute.actionGet();
然后我查询,此查询经过:
boolQuery.must(QueryBuilders.matchQuery("myfield1", parsedStreetName.getBase()));
而这一次没有:
boolQuery.must(QueryBuilders.matchQuery("myfield1", parsedStreetName.getBase()).analyzer("trigrams").minimumShouldMatch("40%"));
它说:
所致:[streetindex] QueryParsingException [[匹配]分析器 [卦]未发现]在 org.elasticsearch.index.query.MatchQueryParser.parse(MatchQueryParser。Java的:101)
如果我离开了settings
开始和结束对象然后trigrams
分析仪被创建(搜索不抱怨)。
但是:
- 我怎么让它失败?
- Java API与REST的不同之处在于?这是故意的吗?
- 搜索没有找到任何与trigrams。
我可以创建其他无效的配置,它很高兴地创建索引。 一个例子:
xContentBuilder = XContentFactory.jsonBuilder().prettyPrint()
.startObject() //root
.startObject("asdf")
.startObject("nana")
.startObject("foobar").field("dada", "dudu").endObject()
.endObject()
.endObject()
.endObject(); //root
我也有一个失踪endObject()一次,并且代码没有抛出。
我很困惑。
关于情况2,ES不会让您通过在映射中引用未知分析器来创建索引。不知道你是怎么做的,但你应该显示一些代码。 – Val