elastic search理解(以下 简称es)
ES(ElasticSearch)是一款分布式全文检索框架,底层基于基于Lucene实现。ES相当于一个数据库,有 index type 属性,index 是索引,相当于数据库的一张表 ,type 是文档,相当于数据库中的行,包含很多字段。与数据库相比更加智能,有很多全文检索方式。
es相关插件
1.kibana 这是一个es数据展示的图形化界面,可以在官网下载。在 https://blog.csdn.net/Meetyouhere/article/details/103188730 这篇博客我中将详细讲解如何使用
2.logstash 这是一个可以将MySQL数据导入到elasticsearch,十万条数据大概1分钟左右,速度还是很快的。不过需要有很多配置。在 这篇博客中我将详细讲解如何配置及使用。
可以在https://www.elastic.co/cn/downloads/past-releases下载所有版本的es,kibana和logstash
ES全文本搜索
可以用es的 Java API 直接进行搜索,对字段进行分割 (汉语和英文使用不同的分词器,在logstash中进行配置)不需要写sql 语句。
搜索种类 (可以参考https://blog.csdn.net/sugesi/article/details/80031151)
一、 简单查询
1.对多个字段进行匹配 是否包含某个单词
2.对某个字段进行模糊搜索可以设置 相似度。
3.范围查询
二、 聚合查询
三、嵌套查询
es 直接在官网下载 解压 ,双击bin 目录下的 elasticsearch.bat即可,访问 http://localhost:9200/ 出现一下类似信息即表示安装成功
可以添加到服务,这样每次电脑启动,此服务也会启动。
下面我将介绍简单查询中的前两个(亲测 实例)
1.获取es 的客户端 即 连接es
private static int port = 9200;
private static String host = "localhost"; //可以写 ip 但是 logstash 配置要修改
public RestHighLevelClient getClient() throws UnknownHostException {
RestClientBuilder restClient = RestClient.builder(new HttpHost(host, port,
"http"));
// 定义监听器,节点出现故障会收到通知。
restClient.setFailureListener(new RestClient.FailureListener() {
@Override
public void onFailure(Node node) {
super.onFailure(node);
}
});
// 定义节点选择器 这个是跳过data=false,ingest为false的节点
restClient.setNodeSelector(NodeSelector.SKIP_DEDICATED_MASTERS);
// 定义默认请求配置回调
restClient.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
@Override
public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
return requestConfigBuilder.setConnectTimeout(90000) // 连接超时(默认为1秒)
.setSocketTimeout(30000); // 套接字超时(默认为30秒)
}
});
RestHighLevelClient client = new RestHighLevelClient(restClient);
return client;
}
2.简单匹配搜索
public void testMatchSearch(RestHighLevelClient client) throws IOException {
// 基础设置 new SearchRequest("patent"); "patent" 为索引名称
SearchRequest searchRequest = new SearchRequest("patent");
// 搜索源构建对象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 匹配关键字
searchSourceBuilder.query(
QueryBuilders.matchQuery("relation_ship", "one integrated can not replace").minimumShouldMatch("1%")); //minimumShouldMatch 最小匹配度
searchRequest.source(searchSourceBuilder);
// 发起请求,获取结果
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); //注意默认返回10条数据 解决办法可以用分页查询,具体实现 下面第一快代码有
SearchHits hits1 = searchResponse.getHits();
SearchHit[] searchHits1 = hits1.getHits();
}
3.对某个字段进行模糊搜索
public static void testMultiMatchSearch(RestHighLevelClient client) throws IOException {
// 基础设置
SearchRequest searchRequest = new SearchRequest("caselist");
// 搜索源构建对象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder queryBuilder =
QueryBuilders.boolQuery().should(QueryBuilders.wildcardQuery("case_number",
("*201910*").toLowerCase())); //一定要转成小写 toLowerCase() 否则搜索不到,加上以后大小写都可搜索到
// 注意 searchSourceBuilder 默认返回10 条数据,如果需要返回实级条数需要设置 //可以使用分页查找 比如设置 searchSourceBuilder.from(1);就是从第二页进行查找,类似于MySQL中的limit
searchSourceBuilder.from(0); //意思是从第一页开始查找
searchSourceBuilder.size(10);//每页大小
searchSourceBuilder.query(queryBuilder);
searchRequest.source(searchSourceBuilder);
// 发起请求,获取结果
SearchResponse searchResponse;
searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
// 得到匹配度高的文档
SearchHit[] searchHits = hits.getHits();
// 打印结果集
System.out.println(searchHits.length);
for (SearchHit searchHit : searchHits) {
System.out.println(searchHit.toString());
System.out.println("=============1");
}
}