使用Java API的ElasticSearch完成建议器
我在网上尝试了一些关于ElasticSearch的suggester特性的示例代码,但我无法解决自动完成解决方案的问题 我的索引:使用Java API的ElasticSearch完成建议器,java,
elasticsearch,Java,
elasticsearch,我在网上尝试了一些关于ElasticSearch的suggester特性的示例代码,但我无法解决自动完成解决方案的问题 我的索引: client.prepareIndex("kodcucom", "article", "1") .setSource(putJsonDocument("ElasticSearch: Java", "ElasticSeach provides Java API, thus it executes all operations " +
client.prepareIndex("kodcucom", "article", "1")
.setSource(putJsonDocument("ElasticSearch: Java",
"ElasticSeach provides Java API, thus it executes all operations " +
"asynchronously by using client object..",
new Date(),
new String[]{"elasticsearch"},
"Hüseyin Akdoğan")).execute().actionGet();
我使用suggestbuilder获取关键字,然后扫描内容“字段”,这里是由于没有结果而出现空指针异常的地方
CompletionSuggestionBuilder skillNameSuggest = new CompletionSuggestionBuilder("skillNameSuggest");
skillNameSuggest.text("lien");
skillNameSuggest.field("content");
SuggestRequestBuilder suggestRequestBuilder = client.prepareSuggest("kodcucom").addSuggestion(skillNameSuggest);
SuggestResponse suggestResponse = suggestRequestBuilder.execute().actionGet();
Iterator<? extends Suggest.Suggestion.Entry.Option> iterator =
suggestResponse.getSuggest().getSuggestion("skillNameSuggest").iterator().next().getOptions().iterator();
编辑2:
我使用的是ElasticSearchJavaAPI的2.1.1版本
编辑3:
我尝试将迭代器行拆分为几个代码块,当将一组数据转换为迭代器时,NPE出现在最后一行,但没有太多帮助
Suggest tempSuggest = suggestResponse.getSuggest();
Suggestion tempSuggestion = tempSuggest.getSuggestion("skillNameSuggest");
Iterator tempIterator = tempSuggestion.iterator();
我看到代码:
SuggestRequestBuilder suggestRequestBuilder = client.prepareSuggest("kodcucom").addSuggestion(skillNameSuggest);
SuggestResponse suggestResponse = suggestRequestBuilder.execute().actionGet();
已包含一个空数组/数据集,我是否错误地使用了“建议请求生成器”?为了使用完成功能,您需要专门指定一个字段,称为完成,并且必须为其指定一个特殊映射 例如:
"mappings": {
"article": {
"properties": {
"content": {
"type": "string"
},
"completion_suggest": {
"type": "completion"}
}
}
}
completion\u suggest字段是我们将在上述代码示例中用于autocomplete函数的字段。在此映射定义之后,数据必须按如下方式进行索引:
curl -XPOST localhost:9200/kodcucom/article/1 -d '{
"content": "elasticsearch",
"completion_suggest": {
"input": [ "es", "elastic", "elasticsearch" ],
"output": "ElasticSearch"
}
}'
然后Java API可以按如下方式用于获取建议:
CompletionSuggestionBuilder skillNameSuggest = new CompletionSuggestionBuilder("complete");
skillNameSuggest.text("es");
skillNameSuggest.field("completion_suggest");
SearchResponse searchResponse = client.prepareSearch("kodcucom")
.setTypes("article")
.setQuery(QueryBuilders.matchAllQuery())
.addSuggestion(skillNameSuggest)
.execute().actionGet();
CompletionSuggestion compSuggestion = searchResponse.getSuggest().getSuggestion("complete");
List<CompletionSuggestion.Entry> entryList = compSuggestion.getEntries();
if(entryList != null) {
CompletionSuggestion.Entry entry = entryList.get(0);
List<CompletionSuggestion.Entry.Option> options =entry.getOptions();
if(options != null) {
CompletionSuggestion.Entry.Option option = options.get(0);
System.out.println(option.getText().string());
}
}
CompletionSuggestionBuilder skillNameSuggest=新的CompletionSuggestionBuilder(“完成”);
技能名称建议文本(“es”);
技能名称建议字段(“完成建议”);
SearchResponse SearchResponse=client.prepareSearch(“kodcucom”)
.setTypes(“条款”)
.setQuery(QueryBuilders.matchAllQuery())
.addSuggest(skillNameSuggest)
.execute().actionGet();
CompletionSuggestion compSuggestion=searchResponse.getSuggestion().getSuggestion(“完成”);
List entryList=compSuggestion.getEntries();
if(entryList!=null){
CompletionSuggestion.Entry=entryList.get(0);
List options=entry.getOptions();
如果(选项!=null){
CompletionSuggestion.Entry.Option=options.get(0);
System.out.println(option.getText().string());
}
}
以下链接提供了有关如何创建建议索引的详细信息
现在,我使用异步SuggestionBuilderJavaAPI根据术语生成建议
SearchRequestBuilder suggestionsExtractor = elasticsearchService.suggestionsExtractor("yourIndexName", "yourIndexType//not necessary", "name_suggest", term);
System.out.println(suggestionsExtractor);
Map<String,Object> suggestionMap = new HashMap<>();
suggestionsExtractor.execute(new ActionListener<SearchResponse>() {
@Override
public void onResponse(SearchResponse searchResponse) {
if(searchResponse.status().equals(RestStatus.OK)) {
searchResponse.getSuggest().getSuggestion("productsearch").getEntries().forEach(e -> {
e.getOptions().forEach(s -> {
ArrayList<Object> contents = new ArrayList<>();
suggestionMap.put(s.getText().string(), s.getScore());
});
});
}
}
@Override
public void onFailure(Exception e) {
Helper.sendErrorResponse(routingContext,new JsonObject().put("details","internal server error"));
e.printStackTrace();
}
});
您从哪里获得NPE(即stacktrace)?请原谅我是ES中的新手,什么是NPE和stacktrace?对不起,NPE是空指针异常的缩写,即运行Java程序时控制台中出现的错误(=stacktrace)。我更新了我的问题,谢谢,您的第一个代码块的
suggestResponse
为空,如何在java语法中实现这一点?CreateIndexRequestBuilder CreateIndexRequestBuilder=client.admin().index().prepareCreate(“您的索引名称”);XContentBuilder mappingBuilder=jsonBuilder().startObject().startObject(“您的类型\名称”).startObject(“属性”).startObject(“您的完成\字段”).field(“类型”,“完成”).endObject().endObject().endObject().endObject().endObject().endObject().endObject();addMapping(“yoru_索引_名称”,mappingBuilder);createIndexRequestBuilder.execute().actionGet()代码>谢谢:)说得对
SearchRequestBuilder suggestionsExtractor = elasticsearchService.suggestionsExtractor("yourIndexName", "yourIndexType//not necessary", "name_suggest", term);
System.out.println(suggestionsExtractor);
Map<String,Object> suggestionMap = new HashMap<>();
suggestionsExtractor.execute(new ActionListener<SearchResponse>() {
@Override
public void onResponse(SearchResponse searchResponse) {
if(searchResponse.status().equals(RestStatus.OK)) {
searchResponse.getSuggest().getSuggestion("productsearch").getEntries().forEach(e -> {
e.getOptions().forEach(s -> {
ArrayList<Object> contents = new ArrayList<>();
suggestionMap.put(s.getText().string(), s.getScore());
});
});
}
}
@Override
public void onFailure(Exception e) {
Helper.sendErrorResponse(routingContext,new JsonObject().put("details","internal server error"));
e.printStackTrace();
}
});
public SearchRequestBuilder suggestionsExtractor(String indexName, String typeName, String field, String term) {
CompletionSuggestionBuilder csb = SuggestBuilders.completionSuggestion(field).text(term);
SearchRequestBuilder suggestBuilder = client.prepareSearch()
.suggest(new SuggestBuilder().addSuggestion(indexName, csb));
return suggestBuilder;
}