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.html은 mappings
섹션의 형제로 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을했고 코드는 포기하지 않았다.
나는 혼란 스럽다.
사례 2의 경우 ES는 매핑에서 알 수없는 분석기를 참조하여 색인을 만들 수 없습니다. 어떻게하는지 잘 모르겠지만 코드를 보여줘야합니다. – Val