【问题标题】:Completion Suggester in Elasticsearch 6.5.4 with Java REST Client APIElasticsearch 6.5.4 中的 Completion Suggester 与 Java REST 客户端 API
【发布时间】:2019-01-28 22:31:39
【问题描述】:

我是弹性搜索的新手,并尝试按照文章 You Complete Mecompletion suggester 集成到我的一个应用程序中

我已将示例 data 插入到带有映射的 ES 中,下面的 CURL 查询(windows)返回 result

curl -H "Content-Type: application/json" -X POST localhost:9200/hotels/_search?pretty -d^
"{^
    \"suggest\": {^
        \"hotel_suggest\" : {^
            \"prefix\" : \"hot\", ^
            \"completion\" : { ^
                \"field\" : \"name_suggest\" ^
            }^
        }^
    }^
}"

不幸的是,下面使用 Java API 的代码没有从数据库返回任何文档(只是为了测试目的打印结果)

    public String suggestSearch() throws IOException {
        SearchRequest searchRequest = new SearchRequest("hotels");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//        searchSourceBuilder.query(QueryBuilders.matchAllQuery());

        SuggestionBuilder termSuggestionBuilder =
                SuggestBuilders.termSuggestion("name").text("hot");
        SuggestBuilder suggestBuilder = new SuggestBuilder();
        suggestBuilder.addSuggestion("name_suggest", termSuggestionBuilder);
        searchSourceBuilder.suggest(suggestBuilder);

        searchRequest.source(searchSourceBuilder);
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);


        Suggest suggest = searchResponse.getSuggest();
        TermSuggestion termSuggestion = suggest.getSuggestion("name_suggest");

        for (TermSuggestion.Entry entry : termSuggestion.getEntries()) {
            for (TermSuggestion.Entry.Option option : entry) {
                String suggestText = option.getText().string();
                System.out.println(suggestText);
            }
        }
        return "SUCCESS";
    }

这段代码有什么问题?

【问题讨论】:

  • 有没有在elasticsearch cluter中查看日志,看看有没有异常?
  • @Dush 查询结果好像是空的,控制台中没有发现异常,也可以得到搜索查询的结果。我要检查任何特定的日志吗?
  • 是的,如果您可以在请求正常访问集群时查看日志,这可能会对您有所帮助,您可以在 `.../elasticsearch-6.2.2/logs/cluster 中找到日志.log'。
  • @Dush 我已经按照你说的检查了日志,没有发现任何异常
  • 根据es doc,如果你想使用Completion Suggeste你必须改变你的代码SuggestBuilders.completionSuggestion( "name" ).prefix( "hot" );CompletionSuggestion entries=suggest.getSuggestion( "name_suggest" );

标签: java elasticsearch


【解决方案1】:

这里是一个示例代码,用于从示例 completion suggester 中获取结果

public static void suggestSearch() 
    {

        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost( "your-ip-here", 9200, "http" ) ) );

        SearchRequest searchRequest = new SearchRequest( "music" );
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        SuggestionBuilder termSuggestionBuilder = SuggestBuilders.completionSuggestion( "suggest" ).prefix( "nev" );
        SuggestBuilder suggestBuilder = new SuggestBuilder();
        suggestBuilder.addSuggestion( "song-suggest", termSuggestionBuilder );
        searchSourceBuilder.suggest( suggestBuilder );

        searchRequest.source( searchSourceBuilder );
        SearchResponse searchResponse = null;

        try
        {
            searchResponse = client.search( searchRequest );
        }
        catch ( IOException e )
        {
            e.printStackTrace();
        }

        Suggest suggest = searchResponse.getSuggest();
        CompletionSuggestion entries = suggest.getSuggestion( "song-suggest" );

        for ( CompletionSuggestion.Entry entry : entries )
        {
            for ( CompletionSuggestion.Entry.Option option : entry.getOptions() )
            {
                String suggestText = option.getText().string();
                System.out.println( suggestText );
            }
        }
    }

例如you-complete-me

public static void suggestSearch()
    {

        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost( "192.168.1.245", 9200, "http" ) ) );

        SearchRequest searchRequest = new SearchRequest( "hotels" );
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
       searchSourceBuilder.query(QueryBuilders.matchAllQuery());

        CompletionSuggestionBuilder completionSuggestionBuilder = SuggestBuilders.completionSuggestion( "name_suggest" ).prefix( "M" );

        SuggestBuilder suggestBuilder = new SuggestBuilder();
        suggestBuilder.addSuggestion( "name_suggest", completionSuggestionBuilder );
        searchSourceBuilder.suggest( suggestBuilder );

        searchRequest.source( searchSourceBuilder );
        SearchResponse searchResponse = null;

        try
        {
            searchResponse = client.search( searchRequest );
        }
        catch ( IOException e )
        {
            e.printStackTrace();
        }

        Suggest suggest = searchResponse.getSuggest();
        CompletionSuggestion entries = suggest.getSuggestion( "name_suggest" );

        for ( CompletionSuggestion.Entry entry : entries )
        {
            for ( CompletionSuggestion.Entry.Option option : entry.getOptions() )
            {
                String suggestText = option.getText().string();
                System.out.println( suggestText );
            }
        }
    }

【讨论】:

  • 非常感谢@Dush。它正在工作,但查询也返回了重复的记录。
  • 你能不能也看看这个问题stackoverflow.com/questions/54360057/…
  • completionSuggestion( "name_suggest" ).prefix( "M" ).skipDuplicates( true );这样的选项来避免重复
  • 当然,我看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
  • 2012-08-22
  • 2018-04-13
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
相关资源
最近更新 更多