我有一个要求,以提供功能,将允许用户搜索通过许多不同的领域元素,并看到结果作为组合列表。所以在UI中,他只需要填充一个文本字段,然后检索结果。
为了可视化,假设我在域中有3个实体:
@Document(indexName="car")
public class Car {
private int id;
private String type;
}
@Document(indexName="garage")
public class Garage{
private int id;
private String address;
}
@Document(indexName="shop")
public class Shop{
private int id;
private String name;
}
现在我想我可以达到这样的要求:
...
@Inject
private ElasticsearchTemplate elasticsearchTemplate;
...
@RequestMapping(value = "/_search/all/{query}",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public List<?> search(@PathVariable String query) {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(queryString(query))
.withIndices("car", "garage", "shop")
.build();
//THIS WORKS
elasticsearchTemplate.queryForIds(searchQuery);
//THIS THROWS ERROR ABOUT WRONG INDEXES
return elasticsearchTemplate.queryForPage(searchQuery, GlobalSearchDTO.class, new GlobalSearchResultMapper()).getContent();
}
...
class GlobalSearchDTO {
public Long id;
public String type;
public Object obj;
}
...
但是当调用第二个函数--负责返回实际文档的函数时,会引发以下异常:
无法标识索引名称。GlobalSearchDTO不是文档。确保document类被@document(indexname=“foo”)注释
我尝试将任何域实体作为类参数传递,但我只是从相应的索引中检索元素,而不是全部。例如调用:
return elasticsearchTemplate.queryForPage(searchQuery, Shop.class, new GlobalSearchResultMapper()).getContent();
仅从“shop”索引检索元素的结果。由于某种原因,似乎没有使用动态提供的指数。
所以问题是:这样检索数据有可能吗?为什么指定'.withindees(“car”、“garage”、“shop”)‘是不够的?
也许我应该考虑其他的解决方案,比如:
>
在循环中搜索索引(一个比一个),连接结果并按分数排序
创建具有“GlobalSearch”索引
并在其中重复数据的单独GlobalSearch实体
提前道谢!
克日什托夫
我已设法为我的问题找到了合适的解决办法。结果表明,当使用“滚动”和“扫描”功能时,会使用动态提供的索引,这意味着查询按预期工作。解决方案代码:
@RequestMapping(value = "/_search/all/{query}",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public List<?> search(@PathVariable String query) {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(queryString(query))
.withIndices("car", "garage", "shop")
.withPageable(new PageRequest(0,1))
.build();
String scrollId = elasticsearchTemplate.scan(searchQuery, 1000, false);
List<GlobalSearchDTO> sampleEntities = new ArrayList<GlobalSearchDTO>();
boolean hasRecords = true;
while (hasRecords){
Page<GlobalSearchDTO> page = elasticsearchTemplate.scroll(scrollId, 5000L , new ResultMapper());
if(page != null) {
sampleEntities.addAll(page.getContent());
hasRecords = page.hasNext();
}
else{
hasRecords = false;
}
}
return sampleEntities;
}
}
并且在ResultMapper类中:
...
for (SearchHit hit : response.getHits()) {
switch(hit.getIndex()) {
case "car": //map to DTO
case "shop": //map to DTO
case "garage": //map to DTO
}
}
...
我确实在ElasticSearch中的字段中有一个数组数据,其中有一个关键字类型。我想用我想搜索的独占值搜索这个数组,即排除不包括在我的搜索关键字中的数组值。请看下面的细节。 谢了! 我有以下弹性搜索索引映射: 使用以下示例数据: 我的搜索是这样的: 我用过MatchQueryBuilder、TermQueryBuilder、TermsQueryBuilder都没用。根据ElasticSearch
我想使用spring-data-elasticsearch-2.1.0创建如下所示的用户索引。注释。我找不到任何注释来添加“null_value”:“null”。这是必需的,因为我们的排序顺序正在失败。 域类 如何在innerfield中通过spring-data-elasticsearch注释添加“null_value”:“null”?我不想在外部创建索引映射。
是否有人成功地将search\u after与spring data elasticsearch一起使用? 我已经将_uid添加到我的排序中,@Controller正确地将其放入我的Pagable中。我打开了慢速查询日志并验证了如果我手动运行@Repository生成的查询,我会得到响应: 我将以下内容添加到我的pojo(由@Repository返回的类): 排序总是返回为null。尝试了两种不同
问题内容: 我们当前的设置是通过Spring Data JPA将MySQL作为主要数据源,并使用Hibernate Search索引和搜索数据。现在,我们决定去Elastic Search进行搜索,以更好地与其他功能保持一致,此外,我们需要让多个服务器共享索引和搜索。 我可以使用Spring Data ElasticSearch来设置Elastic,以通过轻松进行数据索引和搜索。但是现在的挑战是如
我们目前的设置是以MySQL为主要数据源,通过Spring data JPA,Hibernate Search对数据进行索引和搜索。我们现在决定使用弹性搜索来进行搜索,以更好地与其他特性保持一致,此外,我们还需要多个服务器共享索引和搜索。 我可以通过轻松地使用Spring Data ElasticSearch设置弹性数据索引和搜索。但现在的挑战是如何将现有的所有MySQL记录索引到弹性搜索中。Hi
我使用的是Spring Data Elasticsearch,我对使用ElasticSearch6.2的多搜索API感兴趣,以便在一个API请求中执行多个搜索。 https://www.elastic.co/guide/en/elasticsearch/reference/6.2/search-multi-search.html https://www.elastic.co/guide/en/el