使用Spring Data Elasticsearch进行搜索和过滤

3

我有一个JPA实体叫做Invoice,其中包含一些属性,我想要搜索和过滤结果,但是过滤器没有正常工作。我尝试了各种组合,但都没有成功。

下面的代码可以正确地搜索具有某些属性中的“foobar”的实例:

// this is the search string...
String search = "foobar*";
QueryBuilder queryStringQuery = QueryBuilders.queryStringQuery(search);
NativeSearchQueryBuilder searchQuery = new NativeSearchQueryBuilder();
searchQuery.withQuery(queryStringQuery);
// build and run against the ElasticsearchRepository
NativeSearchQuery query = searchQuery.build();
Page<T> result = searchRepository.search(query);

这个代码可以正常工作,给我返回了所有的发票,但现在我只想获取“新发票”,它们由一个叫做“state”的属性给出,该属性的值为“New”。

目前,我尝试过的最后一个代码是这样的(根据SO上类似的问题):

String search = "foobar*";
QueryBuilder queryStringQuery = QueryBuilders.queryStringQuery(search);
NativeSearchQueryBuilder searchQuery = new NativeSearchQueryBuilder();
searchQuery.withQuery(queryStringQuery);

// add filter
QueryBuilder filters = QueryBuilders.termQuery("state", "New");
searchQuery.withFilter(searchFilters);

// build and run against the ElasticsearchRepository
NativeSearchQuery query = searchQuery.build();
Page<T> result = searchRepository.search(query);

这段代码没有输出任何结果,但是实际上应该有数据。

我尝试过创建类似的代码,但是它也不能正常工作:

String search = "foobar*";
QueryBuilder queryStringQuery = QueryBuilders.queryStringQuery(search);
searchFilters = QueryBuilders.termQuery("state", "New");

BoolQueryBuilder searchQuery = QueryBuilders.boolQuery().should(queryStringQuery).must(searchFilters);
Iterable<T> result = searchRepository.search(searchQuery);
1个回答

1
使用类似这样的内容。
QueryBuilder qb;

QueryBuilder stateFilters = QueryBuilders.boolQuery();
((BoolQueryBuilder) filters).filter(QueryBuilders.matchQuery("state", "New"));
qb = QueryBuilders.boolQuery().should(QueryBuilders.queryStringQuery("foobar*")).filter(stateFilters );

这里的过滤器函数可以帮助我们实现这一点。

在这里,qb将具有适当的查询,现在可以使用elasticsearchRepository.search(qb)进行搜索;

下面是来自Spring文档的一些信息: https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.operations


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接