我是ElasticSearch的新手。 我的User类中有一个字符串字段,表示UserStatus,我需要搜索特定状态的所有用户。 在关系数据库中,它恰好是“where ... in”。
我看到了一些示例,在不同的组合中使用termsQuery
,但我没有设法让它们工作(查询没有返回任何内容)。
所以,问题是:是否有链接,显示整个示例或某人遇到此类问题? 任何帮助都很高兴!
//实体本身
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
@Document(indexName = "users", type = "user")
public class User {
@Id
private String id;
private String userStatus;
private String firstName;
private String lastName;
private Date dateCreated;
}
//弹簧服务方法
@Override
public List<User> findByParams(UserSearchRequest userSearchRequest) {
TermsQueryBuilder termsQueryBuilder = QueryBuilders
.termsQuery("userStatus", userSearchRequest.getUserStatuses());
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(boolQuery().must(termsQueryBuilder))
.withPageable(new PageRequest(0, 100))
.build();
return Lists.newArrayList(userRepository.search(searchQuery));
}
// REST请求对象
@AllArgsConstructor
@NoArgsConstructor
@Data
public class UserSearchRequest {
private List<String> userStatuses;
}
答案 0 :(得分:0)
查看Elasticsearch的文档"Finding Multiple Exact Values"
基本上,您需要将搜索条件包装成常数分数查询。
来自Elasticsearch doc(为了子孙后代)
GET /my_store/products/_search
{
"query" : {
"constant_score" : {
"filter" : {
"terms" : {
"price" : [20, 30]
}
}
}
}
}
此示例说明搜索价格为20或30的产品。
您想要的是搜索所有userStatus
个用户List
中传递的值的用户。
在实施方面,您需要更改NativeSearchQueryBuilder
这样的内容:
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(constantScoreQuery(termsQueryBuilder))
.withPageable(new PageRequest(0, 100))
.build();