如何将两个弹性搜索响应合并为一个?

时间:2014-08-05 17:59:41

标签: java elasticsearch

我目前坚持使用多搜索的结果响应,该搜索会为我添加的每个查询返回一组响应,但我需要将响应组合在一起,以便相关性可以确定它们的顺序。获取两个单独的匹配列表并不适合创建统一的搜索结果页面。

我目前的搜索代码是:

SearchRequestBuilder srb1 = client.prepareSearch(index)                     
    .setSearchType(SearchType.QUERY_THEN_FETCH)
    .setQuery(QueryBuilders.queryString(query).field("body").field("title").field("author")
    .addHighlightedField("body").addHighlightedField("title").addHighlightedField("author")
    .setHighlighterPreTags("<div class='highlight'>").setHighlighterPostTags("</div>");

SearchRequestBuilder srb2 = client.prepareSearch(index2)                    
    .setSearchType(SearchType.QUERY_THEN_FETCH)
    .setQuery(
        QueryBuilders.queryString(query)
        .field("file")
        .field("title")
        .field("author")
    )
    .addHighlightedField("file").addHighlightedField("title").addHighlightedField("author")
    .setHighlighterPreTags("<div class='highlight'>").setHighlighterPostTags("</div>");

MultiSearchResponse sr = client.prepareMultiSearch()
    .add(srb1)
    .add(srb2)
    .execute().actionGet();

感谢您提供的任何帮助!

<小时/> 编辑: 这是我的最终代码

SearchRequestBuilder srb = client
                            .prepareSearch(index,index2)    
                            .setSearchType(SearchType.QUERY_AND_FETCH)
                            .setQuery(
                                QueryBuilders.boolQuery()
                                .should(
                                    QueryBuilders.queryString(query)
                                    .field("body")
                                    .field("title")
                                    .field("author")
                                )
                                .should(
                                    QueryBuilders.queryString(query)
                                    .field("file")
                                    .field("title")
                                    .field("author")
                                )
                                .minimumNumberShouldMatch(1)
                            )
                            .addHighlightedField("title")
                            .addHighlightedField("author")
                            .addHighlightedField("body")    
                            .addHighlightedField("file")
                            .setHighlighterPreTags("<div class='highlight'>")
                            .setHighlighterPostTags("</div>");                  
SearchResponse sr = srb.execute().actionGet();

1 个答案:

答案 0 :(得分:0)

我没有使用MultiSearch,而是使用Bool查询:

  

Bool查询

     

匹配匹配其他布尔组合的文档的查询   查询。 bool查询映射到Lucene BooleanQuery。它是使用建造的   一个或多个布尔子句,每个子句都有一个类型化的出现。该   发生类型是:

     

必须

     

子句(查询)必须出现在匹配的文档中。

     

应该

     

子句(查询)应出现在匹配的文档中。在一个   没有must子句的布尔查询,一个或多个应该   条款必须与文档匹配。应该达到的最小条数   可以使用minimum_should_match参数设置匹配。

     

<强> must_not

     

子句(查询)不得出现在匹配的文档中。

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

在您的情况下,我使用should子句组合您的两个查询。像这样:

QueryBuilder qb = QueryBuilders
                    .boolQuery()
                    .should(termQuery("yourfield", "query1"))
                    .should(termQuery("yourfield", "query2"));

http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/query-dsl-queries.html