跳转到内容

访问搜索引擎 API 使用说明

package io.terminus.trantorframework.sdk.sql;
import io.terminus.autumn.model.search.function.SearchQuery;
import io.terminus.trantorframework.Page;
import io.terminus.trantorframework.Paging;
import io.terminus.trantorframework.api.BaseModel;
import io.terminus.trantorframework.api.annotation.SearchSqlType;
import io.terminus.trantorframework.querymodel.QModel;
import io.terminus.trantorframework.sdk.sql.DataStoreClient;
import java.util.List;
import java.util.Map;
/**
* @Description: 查询搜索引擎
* @Author: tianhuannan
* @Date: 2021/3/8 4:26 下午
*/
public class Search {
private static DataStoreClient dataStoreClient;
/**
* 分页查询搜索引擎
* 注意项: 由于搜索模型不支持link字段,这个查询也不支持link查询和join查询。
* 此方法不支持ES的深度分页,from(page)+size最大不能超过50000。
*
* 举例:
* 如果要查询这种sql:select name from test_Model where id = ? order by name desc limit 0,10
* 对应的传参:
* modelClass->test_Model.class
* select->name
* where->id =? order by name desc
* page-> new Page(0,10)
* params-> 1
*
* 对于params有个特殊的语法,当查询条件是 where id in (?) 时,params可以是一个数组。比如[1,2,3,4]。
* 最终解析的sql为 where id in (1,2,3,4)
* 示例模型:
* public class TestModel extends BaseModel<Long> {
* }
*
* 调用示例(非预编译模式):
* String select = "*";
* String where = "id in (1,2,3,4) order by name desc";
* Paging<TestModel> testModelList = Search.paging(TestModel.class, select, where, new Page(0,20));
*
* 调用示例(预编译模式):
* String select = "*";
* String where = "id in (?) order by name desc";
* int[] a={1,2,3,4};
* Paging<TestModel> testModelList = Search.paging(TestModel.class, select, where, new Page(0,20), a);
*
* @param modelClass 模型名
* @param select 查询语句
* @param where 查询条件
* @param page 分页参数
* @param params 预编译传惨
* @return 查询出的反序列好的对象
*/
public static <Model extends BaseModel<Long>> Paging<Model> paging(Class<Model> modelClass, String select,
String where, Page page, Object... params) {
return dataStoreClient.paging(modelClass, select, where, page, SearchSqlType.ES.getIsSearchSql(), params);
}
/**
* 查询当前sql的数据个数
* 和paging类似参数类型,获取数据的总个数
*
* 举例:
* 如果要查询这种sql:select count(*) from test_Model where id = ? order by name desc
* 对应的传参:
* modelClass->test_Model.class
* where->id =? order by name desc
* params-> 1
*
* 调用示例(非预编译模式):
* String where = "id in (1,2,3,4) order by name desc";
* long total = Search.count(TestModel.class, where);
*
* 调用示例(预编译模式):
* String where = "id in (?) order by name desc";
* int[] a={1,2,3,4};
* long total = Search.count(TestModel.class, where, a);
*
* @param modelClass 模型名
* @param where 查询条件
* @param params 预编译传惨
* @return long
*/
public static <Model extends BaseModel<Long>> long count(Class<Model> modelClass, String where, Object... params) {
return dataStoreClient.count(modelClass, where, SearchSqlType.ES.getIsSearchSql(), params);
}
/**
* find接口就是不加分页的查询,由于不加分页容易导致内存oom。所以这个接口最好只作为分组接口使用,目前能查询到数据最大个数为50000。
* 如果不做分组查询,默认返回200条
* 分组查询最多分组2147483647(Integer的最大值)条
*
* 举例:
* sql:select sum(id) as id_sum,count(name) as name_count,name from testModel where id = ? group by name order by name desc
* 搜索根据name分组后的sum(id)和count(name)
* 返回结果: List<Map<String, Object>>。每一个map的格式:
* id_sum==>12
* name_count==>6
* name==>张三
*
* 调用示例(非预编译模式):
* String sql = "select sum(id) as id_sum,count(name) as name_count,name from testModel where" +
* " id in (1,2,3,4) group by name order by name desc";
* List<Map<String, Object>> mapList = Search.find(sql);
*
* 调用示例(预编译模式):
* String sql = "select sum(id) as id_sum,count(name) as name_count,name from testModel where" +
* " id in (?) group by name order by name desc";
* int[] a={1,2,3,4};
* List<Map<String, Object>> mapList = Search.find(sql,a);
*
* @param sql 需要执行的Tsql
* @param params 预编译传惨
* @return List<Map<String, Object>>格式结果集
*/
public static List<Map<String, Object>> find(String sql, Object... params) {
return dataStoreClient.find(sql, SearchSqlType.ES.getIsSearchSql(), params);
}
/**
* 基于QModel的分页数据查询接口
*
* @param queryModel QModel对象
* @param <Model> model泛型
* @return 查询出的反序列好的对象
*/
public static <Model extends BaseModel<Long>> Paging<Model> paging(QModel<Model> queryModel) {
return dataStoreClient.paging(queryModel, SearchSqlType.ES.getIsSearchSql());
}
/**
* 基于searchQuery的分页数据查询接口
* searchQuery的详细写法可参考文档:
* https://trantor-docs.app.terminus.io/v1.x/doc/ds-search/ds-search-userguide
*
* 调用示例:
* SearchQuery searchQuery = new SearchQuery();
* searchQuery.where(a -> a.bool()
* .must(a.rangeQuery(TestModel.intField_field, 1, 10).boosts(2.00f)));
*
* Paging<TestModel> testModelList = Search.searchDSL(TestModel.class, new Page(0, 20),searchQuery);
* 翻译成sql为: select * from testModel where intField>1 and intField<10 limit 0,20
*
* 更加详细的写法请参考文档
*
* @param searchQuery searchQuery对象
* @param <Model> model泛型
* @return 查询出的反序列好的对象
*/
public static <Model extends BaseModel<Long>> Paging<Model> searchDSL(Class<Model> modelClass, Page page, SearchQuery searchQuery) {
return dataStoreClient.searchDSL(modelClass, page, searchQuery);
}
/**
* 对于SearchQuery来说,这个接口最好用于查询聚合函数接口。
* 如果想要查询source里的数据,默认返回结果数据是10条。需要手动设置from和size,设置方式如下:
* searchQuery.from(0).size(100)
*
* searchQuery的详细写法可参考文档:
* https://trantor-docs.app.terminus.io/v1.x/doc/ds-search/ds-search-userguide
*
* 调用示例:
* SearchQuery searchQuery = new SearchQuery();
* searchQuery.where(a -> a.bool()
* .must(a.wildcardQuery(TestModel.stringField_field, "描述").boosts(2.00f)))
* .aggregation(agg -> agg.terms(TestModel.stringField_field + "_alias", TestModel.stringField_field)
* .min(TestModel.intField_field + "_min", TestModel.intField_field));
*
* List<Map<String, Object>> mapList = Search.find(TestModel.class, searchQuery);
* 翻译成sql为: select stringField as stringField_alias,min(intField) as intField_min from testModel where stringField like '%描述%' group by stringField;
*
* @param searchQuery searchQuery对象
* @param <Model> model泛型
* @return List<Map<String, Object>>格式结果集
*/
public static <Model extends BaseModel<Long>> List<Map<String, Object>> find(Class<Model> modelClass, SearchQuery searchQuery) {
return dataStoreClient.find(modelClass, searchQuery);
}
/**
* 查询当前查询条件的数据个数
* searchQuery的详细写法可参考文档:
* https://trantor-docs.app.terminus.io/v1.x/doc/ds-search/ds-search-userguide
*
* 调用示例:
* SearchQuery searchQuery = new SearchQuery();
* searchQuery.where(a -> a.bool()
* .must(a.rangeQuery(TestModel.intField_field, 1, 10).boosts(2.00f)));
*
* long total = Search.count(TestModel.class, searchQuery);
* 翻译成sql为: select count(*) from testModel where intField>1 and intField<10
*
* @param searchQuery searchQuery对象
* @param <Model> model泛型
* @return long
*/
public static <Model extends BaseModel<Long>> long count(Class<Model> modelClass, SearchQuery searchQuery) {
return dataStoreClient.count(searchQuery, modelClass);
}
}