ElasticSearch completion suggester formatting with Java client

时间:2016-02-03 03:35:50

标签: java elasticsearch

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

1 个答案:

答案 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