2017-12-03 180 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();