我目前坚持使用多搜索的结果响应,该搜索会为我添加的每个查询返回一组响应,但我需要将响应组合在一起,以便相关性可以确定它们的顺序。获取两个单独的匹配列表并不适合创建统一的搜索结果页面。
我目前的搜索代码是:
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();
答案 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