创建es连接简单
1 导入依赖
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>5.3.3</version>
</dependency>
<dependency> 。
<groupId>io.searchbox</groupId>
<artifactId>jest-common</artifactId>
<version>5.3.3</version>
</dependency>
2 注入client对象就可以用啦
3优缺点
优点: 提供restful风格api, 访问安全,可以在http层添加安全
缺点: 比TransportClient慢
---------------------------------------------API示例---------------------------------------------------------
创建索引
创建索引字段
批量存储数据
单个数据存储
根据ID更新数据
删除索引
查询数据
-------------------------------------------查询条件API解释-------------------------------------------
1:查询所有
matchAllQuery()匹配所有文件
match_all查询是Elasticsearch中最简单的查询之一。它使我们能够匹配索引中的所有文件。
public SearchResult searchAll(String indexName) throws IOException {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
Search search = new Search.Builder(searchSourceBuilder.toString())
.addIndex(indexName)
.build();
SearchResult result = null ;
result = jestClient.execute(search);
return result;
}
2:解析查询字符串
相比其他可用的查询,query_string查询支持全部的Apache Lucene查询语法
针对多字段的query_string查询:字段名称可配可不配
public JestResult searchWithQuery(Map<String,Object> searchParams, String[] indexName, String[] indexType, String value) throws IOException {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.queryStringQuery("测试"));
Search search = new Search.Builder(searchSourceBuilder.toString())
.addIndices(Arrays.asList(indexName)).build();
JestResult result = jestClient.execute(search);
return result;
}
3:通配符查询(wildcardQuery)
*匹配多个字符,?匹配1个字符
注意:避免* 开始, 会检索大量内容造成效率缓慢
public JestResult wildcardQuery(Map<String,Object> searchParams, String[] indexName, String[] indexType, String value) throws IOException {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.wildcardQuery("mallname","测试"));
Search search = new Search.Builder(searchSourceBuilder.toString())
.addIndices(Arrays.asList(indexName)).build();
JestResult result = jestClient.execute(search);
return result;
}
4:词条查询(termQuery)
词条查询是Elasticsearch中的一个简单查询。它仅匹配在给定字段中含有该词条的文档,而且是确切的、未经分析的词条
termQuery("key", obj) 完全匹配
termsQuery("key", obj1, obj2..)
一次匹配多个值,有一个值是正确的,就可以查询出数据
public JestResult termQuery(Map<String,Object> searchParams, String[] indexName, String[] indexType, String value) throws IOException {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.termsQuery("mallname","测试", "周", "保障"));
Search search = new Search.Builder(searchSourceBuilder.toString())
.addIndices(Arrays.asList(indexName)).build();
JestResult result = jestClient.execute(search);
return result;
}
5:字段匹配查询
match**查询把query参数中的值拿出来,加以分析,然后构建相应的查询**。使用match查询时,Elasticsearch将对一个字段选择合适的分析器,所以可以确定,传给match查询的词条将被建立索引时相同的分析器处理。
/**
* match query搜索的时候,首先会解析查询字符串,进行分词,然后查询,
而term query,输入的查询内容是什么,就会按照什么去查询,并不会解析查询内容,对它分词。
* */
public JestResult MatchQuery(Map<String,Object> searchParams, String[] indexName, String[] indexType, String value) throws IOException {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.multiMatchQuery("mallname","测试", "周", "保障"));
Search search = new Search.Builder(searchSourceBuilder.toString())
.addIndices(Arrays.asList(indexName)).build();
JestResult result = jestClient.execute(search);
return result;
}
Matchquery 和termquery的区别:
match:匹配的时候,会将查询的关键字进行分词,然后根据分词后的结果进行查询。
term:直接使用关键字进行查询,不对关键字进行分词。
multiMatchQuery("text", "field1", "field2"..); 匹配多个字段
6:只查询ID(标识符查询)
标识符查询是一个简单的查询,仅用提供的标识符来过滤返回的文档。
/**
* 根据id查询
* @param id
* @return
*/
public JestResult searchById(String id, String indexName, String indexType) throws Exception {
Get build = new Get.Builder(indexName, id)
.index(indexName)
.type(indexType)
.build();
JestResult result = jestClient.execute(build);
return result;
}
7:范围查询
范围查询使我们能够找到在某一字段值在某个范围里的文档,字段可以是数值型,也可以是
基于字符串的
includeLower(true):包含上界
IncludeUpper(true):包含下界
/**
范围查询使我们能够找到在某一字段值在某个范围里的文档,字段可以是数值型,也可以是
基于字符串的
includeLower(true):包含上界
IncludeUpper(true):包含下界
* */
public JestResult rangeQuery(Map<String,Object> searchParams, String[] indexName, String[] indexType, String value) throws IOException {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.rangeQuery("costprice").from(300).to(1000).includeLower(true).includeUpper(false));
Search search = new Search.Builder(searchSourceBuilder.toString())
.addIndices(Arrays.asList(indexName)).build();
JestResult result = jestClient.execute(search);
return result;
}
8:组合查询(复杂查询)
must(QueryBuilders) : AND
mustNot(QueryBuilders): NOT
should(QueryBuilders):OR
public JestResult boolQuery(Map<String,Object> searchParams, String[] indexName, String[] indexType, String value) throws IOException {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder filterQueryBuilders = QueryBuilders.boolQuery();
filterQueryBuilders.must(QueryBuilders.matchQuery("address", "程序员")).must(QueryBuilders.termQuery("male", "女"));
searchSourceBuilder.postFilter(filterQueryBuilders);
Search search = new Search.Builder(searchSourceBuilder.toString())
.addIndices(Arrays.asList(indexName)).build();
JestResult result = jestClient.execute(search);
return result;
}
9:排序查询:注意排序字段只能是数字或日期
/**
* ASC : 正序(从小到大)
* DESC: 倒序(从大到小)
* */
public JestResult SortOrderQuery(Map<String,Object> searchParams, String[] indexName, String[] indexType, String value) throws IOException {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
Sort sort = new Sort("paytime", Sort.Sorting.DESC);
Search search = new Search.Builder(searchSourceBuilder.toString())
.addIndices(Arrays.asList(indexName))
.addSort(sort)
.build();
JestResult result = jestClient.execute(search);
return result;
}
10:分页查询:
/**
* 分页查找记录
* @param type
* @param searchParams
* @return
*/
public PageInfo searchRecords(String[] index,String[] type, Map<String,Object> searchParams) throws IOException {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder filterQueryBuilders = QueryBuilders.boolQuery();
for (Map.Entry<String,Object> entry : searchParams.entrySet()) {
filterQueryBuilders.must(QueryBuilders.queryStringQuery((String) entry.getValue()).field(entry.getKey()).defaultOperator(Operator.AND));
}
searchSourceBuilder.postFilter(filterQueryBuilders);
searchSourceBuilder.from(1).size(3);
// Sort sort = new Sort("time", Sort.Sorting.DESC);
Search search = new Search.Builder(searchSourceBuilder.toString())
.addIndices(Arrays.asList(index)).build();
JestResult result = jestClient.execute(search);
int hitCount = result.getJsonObject().get("hits").getAsJsonObject().get("total").getAsInt();
PageInfo pageInfo = new PageInfo<>();
pageInfo.setList(result.getSourceAsObjectList(TestBean.class));
pageInfo.setPageNum(1);
pageInfo.setPageSize(3);
pageInfo.setTotal(hitCount);
pageInfo.setSize((int) (hitCount / 3) + 1);
if (result != null && result.isSucceeded()){
return pageInfo;
}
return null;
}