2016-08-03 121 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()接受任何类型的内容。

相关问题