2016-08-03 77 views
3

我正在使用來自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()一次,並且代碼沒有拋出。

我很困惑。

+0

關於情況2,ES不會讓您通過在映射中引用未知分析器來創建索引。不知道你是怎麼做的,但你應該顯示一些代碼。 – Val

回答

1

我的使用案例的正確Java API方法是setSource(),而不是setSettings()

我從SO鏈接的Java代碼示例只設置設置,而不是同時映射。這就是爲什麼那些在層次結構中沒有settings的原因。

所述的SetSource()方法的的Javadoc說:

設置的設置,映射作爲一個單一的源。

就是這樣。現在都清楚了。

但是,我真的不明白爲什麼setSettings()接受任何類型的內容。

相關問題