我目前使用多搜索的结果响应,该响应为我添加的每个查询返回一个响应数组,但是我需要将响应组合起来,以便相关性可以确定它们的顺序。对于创建一个统一的搜索结果页面来说,返回两个分离的点击列表并不是很好。
我当前的搜索代码是:
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查询:
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-bool-query.htmlBool查询
匹配其他的布尔组合的文档的查询查询。bool查询映射到Lucene BooleanQuery。它是用一个或多个布尔子句,每个子句都有一个类型的出现。的出现类型为:
子句(查询)必须出现在匹配的文档中。
子句(查询)应该出现在匹配的文档中。在一个布尔查询没有必须子句,一个或多个应该条款必须与单据相符。应该条款的最少数量可以使用minimum_should_match参数设置匹配。
must_not
子句(查询)不能出现在匹配的文档中。
在您的情况下,我将使用应该子句组合您的两个查询。像这样:
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