2016-08-03 3 views
3

Java에서 현재 ES 2.3.4로 재생 중이며 오류가 발생하면 자동 응답합니다. 문제의 원인을 추적하는 것은 매우 어렵습니다.구성 오류시 ElasticSearch가 실패합니다.

질문 : 마법을 시도하는 대신 ES를 비 관용이며 일찍 실패하도록 구성하려면 어떻게합니까?


사례 1 : 자바 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.htmlmappings 섹션의 형제로 settings 섹션을 사용하며 analysis 섹션으로 직접 시작하지 않습니다. 나는 신선한 인덱스를 생성

 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())); 

:

,451,515,
boolQuery.must(QueryBuilders.matchQuery("myfield1", parsedStreetName.getBase()).analyzer("trigrams").minimumShouldMatch("40%")); 

은 말한다 :에 의한

: [streetindex] QueryParsingException [경기] 분석기 은 []을 (를) 찾을 수 없습니다 괘] org.elasticsearch.index.query.MatchQueryParser.parse (MatchQueryParser에서.자바 : 101)

내가 다음 trigrams 분석기 (으로 작성되는 settings 시작과 끝 목적을두면 검색 불평하지 않습니다).

그러나 :

  • 는 어떻게 그것이 실패해야합니까?
  • 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 메소드는 이 아니라 setSettings()입니다.

그래서 내가 링크 한 Java 코드 예제는 설정 만 설정하고 동시에 매핑도 설정하지 않습니다. 그렇기 때문에 계층에 settings이없는 것입니다.

setSource() 메소드의 Javadoc을 말한다 :

이 하나의 소스로 설정 및 매핑을 설정합니다.

그렇습니다. 모두 지금 취소.

그러나 실제로 setSettings()에서 모든 종류의 콘텐츠를 허용하는 이유를 이해하지 못합니다.

관련 문제