關於ElasticsearchRepository的使用筆記
阿新 • • 發佈:2019-05-19
以下是使用Spring data Jpa操作ES的一些記錄
在ElasticsearchRepository中我們可以使用Not
Add
Like
Or
Between
等關鍵詞自動建立查詢語句。
記住上面這句話,程式碼示例:
public interface EmployeeRepository extends ElasticsearchRepository<Employee, String> { /** * 通過ID欄位查詢 */ Employee queryEmployeeById(String id); }
開啟這個類我們發現:
@NoRepositoryBean public interface ElasticsearchRepository<T, ID extends Serializable> extends ElasticsearchCrudRepository<T, ID> { <S extends T> S index(S var1); Iterable<T> search(QueryBuilder var1); Page<T> search(QueryBuilder var1, Pageable var2); Page<T> search(SearchQuery var1); Page<T> searchSimilar(T var1, String[] var2, Pageable var3); void refresh(); Class<T> getEntityClass(); }
那麼具體關鍵字有哪些呢?下面一一列出:
關鍵字 | 使用示例 | 等同於的ES查詢 |
---|---|---|
And | findByNameAndPrice | {“bool” : {“must” : [ {“field” : {“name” : “?”}}, {“field” : {“price” : “?”}} ]}} |
Or | findByNameOrPrice | {“bool” : {“should” : [ {“field” : {“name” : “?”}}, {“field” : {“price” : “?”}} ]}} |
Is | findByName | {“bool” : {“must” : {“field” : {“name” : “?”}}}} |
Not | findByNameNot | {“bool” : {“must_not” : {“field” : {“name” : “?”}}}} |
Between | findByPriceBetween | {“bool” : {“must” : {“range” : {“price” : {“from” : ?,”to” : ?,”include_lower” : true,”include_upper” : true}}}}} |
LessThanEqual | findByPriceLessThan | {“bool” : {“must” : {“range” : {“price” : {“from” : null,”to” : ?,”include_lower” : true,”include_upper” : true}}}}} |
GreaterThanEqual | findByPriceGreaterThan | {“bool” : {“must” : {“range” : {“price” : {“from” : ?,”to” : null,”include_lower” : true,”include_upper” : true}}}}} |
Before | findByPriceBefore | {“bool” : {“must” : {“range” : {“price” : {“from” : null,”to” : ?,”include_lower” : true,”include_upper” : true}}}}} |
After | findByPriceAfter | {“bool” : {“must” : {“range” : {“price” : {“from” : ?,”to” : null,”include_lower” : true,”include_upper” : true}}}}} |
Like | findByNameLike | {“bool” : {“must” : {“field” : {“name” : {“query” : “? *”,”analyze_wildcard” : true}}}}} |
StartingWith | findByNameStartingWith | {“bool” : {“must” : {“field” : {“name” : {“query” : “? *”,”analyze_wildcard” : true}}}}} |
EndingWith | findByNameEndingWith | {“bool” : {“must” : {“field” : {“name” : {“query” : “*?”,”analyze_wildcard” : true}}}}} |
Contains/Containing | findByNameContaining | {“bool” : {“must” : {“field” : {“name” : {“query” : “?”,”analyze_wildcard” : true}}}}} |
In | findByNameIn(Collectionnames) | {“bool” : {“must” : {“bool” : {“should” : [ {“field” : {“name” : “?”}}, {“field” : {“name” : “?”}} ]}}}} |
NotIn | findByNameNotIn(Collectionnames) | {“bool” : {“must_not” : {“bool” : {“should” : {“field” : {“name” : “?”}}}}}} |
True | findByAvailableTrue | {“bool” : {“must” : {“field” : {“available” : true}}}} |
False | findByAvailableFalse | {“bool” : {“must” : {“field” : {“available” : false}}}} |
OrderBy | findByAvailableTrueOrderByNameDesc | {“sort” : [{ “name” : {“order” : “desc”} }],”bool” : {“must” : {“field” : {“available” : true}}}} |
那麼通過上述我們就可以寫出一個簡單的例子:
@Autowired
private EmployeeRepository employeeRepository;
/**
* 查詢
*/
@RequestMapping("/query/{id}")
public Employee query(@PathVariable("id") String id) {
Employee accountInfo = employeeRepository.queryEmployeeById(id);
System.err.println(accountInfo.toString());
return accountInfo;
}
/**
* 聚合查詢測試
*/
@RequestMapping("/querySum")
public Iterable querySum() {
/**
* 建立查詢體
*/
BoolQueryBuilder builder = QueryBuilders.boolQuery();
/**
* 設定聚合條件
*/
RangeQueryBuilder query = QueryBuilders.rangeQuery("age").from("30").to("60");
/**
* 將聚合條件設定入查詢體之中
*/
builder.must(query);
Iterable<Employee> search = employeeRepository.search(builder);
return search;
}
至此最基本的功能已經完成
思考:
為什麼要使用ElasticsearchRepository而不使用原生的ES 的 SQL呢?