I am new to suggester java API with elasticsearch, I using version 2.1.1, I look all the resources on the net is about curl instead of java example, for now I got a index called "facebook" and 1 dataset prepared. it can be searched with the search API
CompletionSuggestionBuilder suggestionsBuilder = new CompletionSuggestionBuilder("completeMe");
suggestionsBuilder.text("qui");
suggestionsBuilder.field("content");
SuggestRequestBuilder suggestRequestBuilder =
client.prepareSuggest("facebook").addSuggestion(suggestionsBuilder);
then I try on suggester API of elasticsearch, I got these errors I dont know what is missing out. Please advice me with some examples. thanks in advance.
{author=Lance Tan Kah Woon, postDate=2016-01-31T13:16:49.767Z, title=Posting, content=today's weather quite ok, tags=[hashtag]}
-------------------------------------------------------
16947 [elasticsearch[Ego the Living Planet][suggest][T#1]] DEBUG org.elasticsearch.action.suggest - [Ego the Living Planet] [facebook][0], node[dEgugNdOSjiePr9gmltemg], [P], v[36], s[STARTED], a[id=eRze_kTISNu5xJH83J4aQw]: failed to execute [[[facebook]], suggestSource[{"completeMe":{"text":"qui","completion":{"field":"content"}}}]]
RemoteTransportException[[Ego the Living Planet][127.0.0.1:9300][indices:data/read/suggest[s]]]; nested: ElasticsearchException[failed to execute suggest]; nested: ClassCastException[org.elasticsearch.index.mapper.core.StringFieldMapper$StringFieldType cannot be cast to org.elasticsearch.index.mapper.core.CompletionFieldMapper$CompletionFieldType];
Caused by: ElasticsearchException[failed to execute suggest]; nested: ClassCastException[org.elasticsearch.index.mapper.core.StringFieldMapper$StringFieldType cannot be cast to org.elasticsearch.index.mapper.core.CompletionFieldMapper$CompletionFieldType];
at org.elasticsearch.action.suggest.TransportSuggestAction.shardOperation(TransportSuggestAction.java:152)
at org.elasticsearch.action.suggest.TransportSuggestAction.shardOperation(TransportSuggestAction.java:61)
at org.elasticsearch.action.support.broadcast.TransportBroadcastAction$ShardTransportHandler.messageReceived(TransportBroadcastAction.java:268)
at org.elasticsearch.action.support.broadcast.TransportBroadcastAction$ShardTransportHandler.messageReceived(TransportBroadcastAction.java:264)
at org.elasticsearch.transport.TransportService$4.doRun(TransportService.java:350)
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassCastException: org.elasticsearch.index.mapper.core.StringFieldMapper$StringFieldType cannot be cast to org.elasticsearch.index.mapper.core.CompletionFieldMapper$CompletionFieldType
at org.elasticsearch.search.suggest.completion.CompletionSuggestParser.parse(CompletionSuggestParser.java:105)
at org.elasticsearch.search.suggest.SuggestParseElement.parseInternal(SuggestParseElement.java:94)
at org.elasticsearch.action.suggest.TransportSuggestAction.shardOperation(TransportSuggestAction.java:145)
... 8 more
16948 [elasticsearch[Ego the Living Planet][suggest][T#3]] DEBUG org.elasticsearch.action.suggest - [Ego the Living Planet] [facebook][2], node[dEgugNdOSjiePr9gmltemg], [P], v[36], s[STARTED], a[id=ZH03JW9SRB6rHDYUxvrW6g]: failed to execute [[[facebook]], suggestSource[{"completeMe":{"text":"qui","completion":{"field":"content"}}}]]
RemoteTransportException[[Ego the Living Planet][127.0.0.1:9300][indices:data/read/suggest[s]]]; nested: ElasticsearchException[failed to execute suggest]; nested: ClassCastException[org.elasticsearch.index.mapper.core.StringFieldMapper$StringFieldType cannot be cast to org.elasticsearch.index.mapper.core.CompletionFieldMapper$CompletionFieldType];
Caused by: ElasticsearchException[failed to execute suggest]; nested: ClassCastException[org.elasticsearch.index.mapper.core.StringFieldMapper$StringFieldType cannot be cast to org.elasticsearch.index.mapper.core.CompletionFieldMapper$CompletionFieldType];
at org.elasticsearch.action.suggest.TransportSuggestAction.shardOperation(TransportSuggestAction.java:152)
at org.elasticsearch.action.suggest.TransportSuggestAction.shardOperation(TransportSuggestAction.java:61)
at org.elasticsearch.action.support.broadcast.TransportBroadcastAction$ShardTransportHandler.messageReceived(TransportBroadcastAction.java:268)
at org.elasticsearch.action.support.broadcast.TransportBroadcastAction$ShardTransportHandler.messageReceived(TransportBroadcastAction.java:264)
at org.elasticsearch.transport.TransportService$4.doRun(TransportService.java:350)
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassCastException: org.elasticsearch.index.mapper.core.StringFieldMapper$StringFieldType cannot be cast to org.elasticsearch.index.mapper.core.CompletionFieldMapper$CompletionFieldType
at org.elasticsearch.search.suggest.completion.CompletionSuggestParser.parse(CompletionSuggestParser.java:105)
at org.elasticsearch.search.suggest.SuggestParseElement.parseInternal(SuggestParseElement.java:94)
at org.elasticsearch.action.suggest.TransportSuggestAction.shardOperation(TransportSuggestAction.java:145)
... 8 more
答案 0 :(得分:0)
如错误所示,ES无法将字段content
映射到completion
字段类型。您需要将映射更改为类似的内容。
PUT facebook
{
"mappings": {
"my_type": {
"properties": {
"content": {
"type": "completion"
}
}
}
}
}
您可以参考docs了解详情。您需要reindex
数据,然后建议才有效。
编辑1 :使用Java API,您可以先创建索引 facebook ,然后应用这样的映射。您可以参考this SO question。
client.admin().indices().create(new CreateIndexRequest("facebook")).actionGet();
XContentBuilder mapping = jsonBuilder()
.startObject()
.startObject("doctype")
.startObject("properties")
.startObject("content")
.field("type", "completion")
.endObject()
.endObject()
.endObject()
.endObject();
PutMappingResponse putMappingResponse = client.admin().indices()
.preparePutMapping("facebook")
.setType("doctype")
.setSource(mapping)
.execute().actionGet();
开始时请参考Official Docs。