1. 程式人生 > >關於ElasticsearchRepository的使用筆記

關於ElasticsearchRepository的使用筆記

一個很全的API連結文件

以下是使用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呢?