【发布时间】:2014-03-25 09:18:29
【问题描述】:
我的页面上有一个搜索字段,该搜索字段应该搜索多个索引。 我可以毫无问题地搜索一个索引,如 spring-data-elasticsearch 文档中所述。
但如果我搜索,例如“Foo”,我希望得到以下列表作为按相关性排序的结果:
{ title: "Foo" } -> Entity: Sample
{ name: "FooTest" } -> Entity: Test
{ title: "FooSample2" } -> Entity: Sample
// ...and so on
// The entities are not part of the same parent. So, they are complete different.
为此,我在文档中找不到任何可以帮助我的内容。
有人可以帮忙吗?
编辑:
final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchAllQuery())
.withIndices("game-index", "lets-play-index", "video-index", "genre-index", "platform-index", "user-index")
.withPageable(new PageRequest(0, 10))
.build();
// when
final Page<SearchResult> sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SearchResult.class, new SearchResultMapper() {
@Override
public <T> FacetedPage<T> mapResults(
final SearchResponse response,
final Class<T> clazz,
final Pageable pageable) {
LoggerUtil.get(this.getClass())
.debug(response.toString());
LoggerUtil.get(this.getClass())
.debug(response.getHits()
.toString());
LoggerUtil.get(this.getClass())
.debug("TotalHits: " + response.getHits()
.totalHits());
final long totalHits = response.getHits()
.totalHits();
final List<T> results = new ArrayList<T>();
for (final SearchHit hit : response.getHits()) {
LoggerUtil.get(this.getClass())
.debug(hit.sourceAsString());
if (hit != null) {
final T result = null;
/*
* if (!Strings.isNullOrEmpty(hit.sourceAsString()))
* { result = mapEntity(hit.sourceAsString(),
* clazz); } else { result =
* mapEntity(hit.getFields() .values(), clazz); }
*/
// setPersistentEntityId(result, hit.getId(),
// clazz);
results.add(result);
}
}
final List<FacetResult> facets = new ArrayList<FacetResult>();
if (response.getFacets() != null) {
for (final Facet facet : response.getFacets()) {
final FacetResult facetResult = DefaultFacetMapper.parse(facet);
if (facetResult != null) {
facets.add(facetResult);
}
}
}
return new FacetedPageImpl<T>(results, pageable, totalHits, facets);
}
});
SearchResultMapper 内部的响应如下:
{
"took" : 5,
"timed_out" : false,
"_shards" : {
"total" : 30,
"successful" : 30,
"failed" : 0
},
"hits" : {
"total" : 0,
"max_score" : null,
"hits" : [ ]
}
}
如果我用这个做一个简单的搜索:
final Class<?> clazz = Class.forName(className);
final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(getQueryBuilderForQuery(query))
.build();
final List<?> results = elasticsearchTemplate.queryForList(searchQuery, clazz);
它有效,我得到了很多结果。这意味着我的索引正在工作。
我绝对不知道我能做什么。非常感谢。
【问题讨论】:
-
如果我正在阅读您的内容,那么您想跨多个索引进行搜索,这尚不支持但没什么大不了的,您能否在 jira.spring.io/browse/DATAES 创建 JIRA ?并将被推送到下一次迭代。
-
你能给我一些“快速”的解决方案或指导我必须使用什么来获得我需要的结果列表吗?
-
看看下面的答案,很抱歉造成混淆。它已经支持了!
标签: spring elasticsearch spring-data spring-data-elasticsearch