我正在使用來自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