es的搜索类型(SearchType)有4种
query and fetch(速度最快)(返回N倍数据量,多个副本连同自己分片中的数据都会呈现出来,数据重复!)
query then fetch(默认的搜索方式)
DFS query and fetch ~>用来给检索到的每条记录计算分数
DFS query then fetch(可以更精确控制搜索打分和排名。)
从性能考虑QUERY_AND_FETCH是最快的,DFS_QUERY_THEN_FETCH是最慢的。从搜索的准确度来说,DFS要比非DFS的准确度更高。
分页检索api代码
public class SearchType {
/**
* TransportClient实例,用于访问远程的es集群
*/
private TransportClient client;
/**
* 初始化
*/
@Before
public void init() throws UnknownHostException {
Settings settings = Settings.builder().put("cluster.name", "cluster").build();
client = new PreBuiltTransportClient(settings);
client.addTransportAddress(new TransportAddress(InetAddress.getByName("mini1"), 9300));
client.addTransportAddress(new TransportAddress(InetAddress.getByName("mini2"), 9300));
client.addTransportAddress(new TransportAddress(InetAddress.getByName("mini3"), 9300));
}
//测试分页查询
@Test
public void testSearch() {
//设置每页的大小
int pageSize=3;
//设置查询第几页的内容
int currentPageNo=1;
SearchResponse res = client
.prepareSearch("bigdata")
.setTypes("product")
.setSearchType(org.elasticsearch.action.search.SearchType.DFS_QUERY_THEN_FETCH)
.setFrom((currentPageNo-1)*pageSize)
.setSize(pageSize)
//精准查询
// .setQuery(QueryBuilders.termQuery("name","sqoop"))
//正则,name字段里以s开头的都会查到
// .setQuery(QueryBuilders.regexpQuery("name","s.*"))
//通配符,意思同上
.setQuery(QueryBuilders.wildcardQuery("name","s*"))
.get();
//查询结果