“使用Java API进行模拟弹性搜索”

时间:2017-12-03 07:34:27

标签: java spring elasticsearch nosql

我是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;
}

1 个答案:

答案 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();