【问题标题】:ElasticSearch completion suggester formatting with Java client使用 Java 客户端格式化 ElasticSearch 完成建议程序
【发布时间】:2016-03-01 12:13:21
【问题描述】:

我是使用 elasticsearch 的建议器 java API 的新手,我使用 2.1.1 版,我看网上的所有资源都是关于 curl 而不是 java 示例,现在我得到了一个名为“facebook”的索引和 1 个准备好的数据集.可以使用搜索API进行搜索

CompletionSuggestionBuilder suggestionsBuilder = new CompletionSuggestionBuilder("completeMe");
        suggestionsBuilder.text("qui");
        suggestionsBuilder.field("content");
        SuggestRequestBuilder suggestRequestBuilder =
                client.prepareSuggest("facebook").addSuggestion(suggestionsBuilder);

然后我尝试使用 elasticsearch 的建议器 API,我得到了这些错误,我不知道错过了什么。请用一些例子给我建议。提前致谢。

{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

【问题讨论】:

  • 为什么[duplicated] 是标题的一部分?

标签: java elasticsearch


【解决方案1】:

正如错误提示的那样,ES 无法将字段 content 映射到 completion 字段类型。您需要将映射更改为类似的内容。

PUT facebook
{
  "mappings": {
    "my_type": {
      "properties": {
        "content": {
          "type": "completion"
        }
      }
    }
  }
}

您可以参考docs 了解更多信息。您需要reindex 数据,然后建议才会起作用。

EDIT 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

【讨论】:

  • 对不起,我是 ES 新手,我怎么能用 Java 执行这些命令?还是只能在 curl 中执行?
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
相关资源
最近更新 更多