“where .. in”模拟elasticsearch与Java API
问题描述:
我是ElasticSearch的新手。 我在我的User类中有一个字符串字段,代表UserStatus,我需要搜索处于特定状态的所有用户。 在关系数据库中,它完全是“where .. in”。“where .. in”模拟elasticsearch与Java API
我看到的例子,使用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;
}
答
检查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();
你尝试运行直接查询到elasticsearch(卷曲或某种基于Web的用户界面),而不是通过Java ?通常这就是帮助我 – sfat
我同意@sfat,尝试与直接弹性搜索查询。以下是基于特定条件检索值的查询。 – Sree
下面是一个查询{“query”:{“constant_score”:{“filter”:{“bool”:{“should”:[{“term”:{“employee”:“foo”}}]}} }}}。方法 - >发布,网址 - > http:// localhost:9200///_search。 –
Sree