2017-12-03 268 views
0

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

你尝试运行直接查询到elasticsearch(卷曲或某种基于Web的用户界面),而不是通过Java ?通常这就是帮助我 – sfat

+0

我同意@sfat,尝试与直接弹性搜索查询。以下是基于特定条件检索值的查询。 – Sree

+0

下面是一个查询{“query”:{“constant_score”:{“filter”:{“bool”:{“should”:[{“term”:{“employee”:“foo”}}]}} }}}。方法 - >发布,网址 - > http:// localhost:9200///_search。 – Sree

回答

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