如何将两个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();

不使用MultiSearch,而是使用Bool查询:

Bool查询

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

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

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

must_not

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

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

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

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

最新更新