Elasticsearch 7.x建议自动组合如何转换为Java?

发布于 2025-02-05 21:06:38 字数 4614 浏览 2 评论 0原文

我是Elasticsearch和Java的新手,并试图在我的应用程序中使用Elasticsearch Backend实施自动安装。

这是问题描述:

如果我对这样的上下文进行关注,则它可以从Kibana/Elastic/Dev Console起作用:

  POST /autocompleteterms_v20/_search
 {
 "suggest": {
"completeMe": {
  "text": "spirit",
  "completion": {
    "field": "name_suggest",
    "contexts": {
      "lang": [ "en" ]
    }
  }
 }
}
}

但是当我从Java做到这一点时:

SuggestBuilder sb = new SuggestBuilder()

LinkedHashMap<String, ContextMapping> map = new LinkedHashMap<>();
    map.put(prefLang, ContextBuilder.category("lang").field("lang").build())
sb.addSuggestion("completeMe", SuggestBuilders.completionSuggestion("name_suggest" ).text(term).contexts(map))
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
    sourceBuilder.query(query)
sourceBuilder.suggest(sb)
SearchRequest searchRequest = new SearchRequest()
searchRequest.source(sourceBuilder)
searchRequest.indices(AUTOCOMPLETE_TERMS_ALIAS + "_v4")

SearchRequest request = new SearchRequest()
request.source(sourceBuilder)
SearchResponse suggestResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT)


int count = 5

if (suggestResponse.getHits().size() > 0) {
    for (Suggest.Suggestion.Entry.Option next : suggestResponse.getSuggest().getSuggestion("completeMe").iterator().next().getOptions()) {
        if (count < 0) break
        count--

        def text = next.getText().string()
        result.getOptions().add(new AutocompleteResult.SuggestOption(text))

        if (log.isTraceEnabled()) {
            log.trace("Got suggestion: {}", text)
        }
    }
  }
}

不成功,我会收到以下错误:

  org.codehaus.groovy.runtime.metaclass.MethodSelectionException: Could not find which method 
  <init>() to invoke from this list:
  public org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder#<init> 
  (org.elasticsearch.common.io.stream.StreamInput)
  private org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder#<init> 
 (java.lang.String, org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder)
 groovy.lang.MissingPropertyException: No such property: ContextBuilder for class: 
 org.proj.myproj.content.index.elasticsearch.ElasticSearchService
 at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:65) ~ 
 [groovy-3.0.9.jar:3.0.9]
at org.codehaus.groovy.runtime.callsite.GetEffectivePogoPropertySite.getProperty(GetEffectivePogoPropertySite.java:87) ~[groovy-3.0.9.jar:3.0.9]
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:341) ~[groovy-3.0.9.jar:3.0.9]
at org.proj.myproj.content.index.elasticsearch.ElasticSearchService.getSuggestions(ElasticSearchService:291) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.codehaus.groovy.runtime.callsite.PlainObjectMetaMethodSite.doInvoke(PlainObjectMetaMethodSite.java:43) ~[groovy-3.0.9.jar:3.0.9]
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:193) ~[groovy-3.0.9.jar:3.0.9]
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:61) ~[groovy-3.0.9.jar:3.0.9]
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:51) ~[groovy-3.0.9.jar:3.0.9]
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:171) ~[groovy-3.0.9.jar:3.0.9]
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:203) ~[groovy-3.0.9.jar:3.0.9]
at org.proj.myproj.content.index.elasticsearch.ElasticSearchService.get(ElasticSearchService:153) ~[na:na]
at org.proj.myproj.controller.SearchController.autocomplete(SearchController.java:85) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]

任何想法我在做什么错误的?

I am new to elasticsearch and java and attempting to implement autocomplition with elasticsearch backend in my application.

Here is the problem description:

if I make following query with the context like this it works from the kibana/elastic/dev console:

  POST /autocompleteterms_v20/_search
 {
 "suggest": {
"completeMe": {
  "text": "spirit",
  "completion": {
    "field": "name_suggest",
    "contexts": {
      "lang": [ "en" ]
    }
  }
 }
}
}

But when I do it from java:

SuggestBuilder sb = new SuggestBuilder()

LinkedHashMap<String, ContextMapping> map = new LinkedHashMap<>();
    map.put(prefLang, ContextBuilder.category("lang").field("lang").build())
sb.addSuggestion("completeMe", SuggestBuilders.completionSuggestion("name_suggest" ).text(term).contexts(map))
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
    sourceBuilder.query(query)
sourceBuilder.suggest(sb)
SearchRequest searchRequest = new SearchRequest()
searchRequest.source(sourceBuilder)
searchRequest.indices(AUTOCOMPLETE_TERMS_ALIAS + "_v4")

SearchRequest request = new SearchRequest()
request.source(sourceBuilder)
SearchResponse suggestResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT)


int count = 5

if (suggestResponse.getHits().size() > 0) {
    for (Suggest.Suggestion.Entry.Option next : suggestResponse.getSuggest().getSuggestion("completeMe").iterator().next().getOptions()) {
        if (count < 0) break
        count--

        def text = next.getText().string()
        result.getOptions().add(new AutocompleteResult.SuggestOption(text))

        if (log.isTraceEnabled()) {
            log.trace("Got suggestion: {}", text)
        }
    }
  }
}

Is not successful and I receive the following error:

  org.codehaus.groovy.runtime.metaclass.MethodSelectionException: Could not find which method 
  <init>() to invoke from this list:
  public org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder#<init> 
  (org.elasticsearch.common.io.stream.StreamInput)
  private org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder#<init> 
 (java.lang.String, org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder)
 groovy.lang.MissingPropertyException: No such property: ContextBuilder for class: 
 org.proj.myproj.content.index.elasticsearch.ElasticSearchService
 at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:65) ~ 
 [groovy-3.0.9.jar:3.0.9]
at org.codehaus.groovy.runtime.callsite.GetEffectivePogoPropertySite.getProperty(GetEffectivePogoPropertySite.java:87) ~[groovy-3.0.9.jar:3.0.9]
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:341) ~[groovy-3.0.9.jar:3.0.9]
at org.proj.myproj.content.index.elasticsearch.ElasticSearchService.getSuggestions(ElasticSearchService:291) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.codehaus.groovy.runtime.callsite.PlainObjectMetaMethodSite.doInvoke(PlainObjectMetaMethodSite.java:43) ~[groovy-3.0.9.jar:3.0.9]
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:193) ~[groovy-3.0.9.jar:3.0.9]
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:61) ~[groovy-3.0.9.jar:3.0.9]
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:51) ~[groovy-3.0.9.jar:3.0.9]
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:171) ~[groovy-3.0.9.jar:3.0.9]
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:203) ~[groovy-3.0.9.jar:3.0.9]
at org.proj.myproj.content.index.elasticsearch.ElasticSearchService.get(ElasticSearchService:153) ~[na:na]
at org.proj.myproj.controller.SearchController.autocomplete(SearchController.java:85) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]

Any idea what I do wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

若言繁花未落 2025-02-12 21:06:38

您可以这样尝试:

    SuggestBuilder sb = new SuggestBuilder();

    List<CategoryQueryContext> ctx = new ArrayList<>();
    ctx.add(CategoryQueryContext.builder().setCategory("en").build());
    Map<String, List<? extends ToXContent>> map = Collections.singletonMap("lang", ctx);
    
    sb.addSuggestion("completeMe", SuggestBuilders.completionSuggestion("name_suggest").text(term).contexts(map));
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(query);
    sourceBuilder.suggest(sb);
    SearchRequest searchRequest = new SearchRequest();
    searchRequest.source(sourceBuilder);
    searchRequest.indices(AUTOCOMPLETE_TERMS_ALIAS + "_v4");

    SearchRequest request = new SearchRequest();
    request.source(sourceBuilder);
    SearchResponse suggestResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);

You can try this way:

    SuggestBuilder sb = new SuggestBuilder();

    List<CategoryQueryContext> ctx = new ArrayList<>();
    ctx.add(CategoryQueryContext.builder().setCategory("en").build());
    Map<String, List<? extends ToXContent>> map = Collections.singletonMap("lang", ctx);
    
    sb.addSuggestion("completeMe", SuggestBuilders.completionSuggestion("name_suggest").text(term).contexts(map));
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(query);
    sourceBuilder.suggest(sb);
    SearchRequest searchRequest = new SearchRequest();
    searchRequest.source(sourceBuilder);
    searchRequest.indices(AUTOCOMPLETE_TERMS_ALIAS + "_v4");

    SearchRequest request = new SearchRequest();
    request.source(sourceBuilder);
    SearchResponse suggestResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文