Elasticsearch的配置及使用
ElasticSearch简介
Elasticsearch是一个基于Apache Lucene™的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
特点:
- 分布式的实时文件存储,每个字段都被索引并可被搜索
- 分布式的实时分析搜索引擎–做不规则查询
- 可以扩展到上百台服务器,处理PB级结构化或非结构化数据
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。ES可以用来进行全文检索(全部字段)、模糊查询(搜索)、数据分析(提供分析语法,例如聚合)等。
elasticsearch安装
安装步骤很简单,去官网下载对应操作系统的压缩包后解压,命令行下进入bin目录,输入./elasticsearch即可启动。对教程感兴趣可移步:Mac下安装es
Java客户端的选择
目前市面上有两类客户端,一类是TransportClient 为代表的ES原生客户端,不能执行原生dsl语句必须使用它的Java api方法。
另外一种是以Rest Api为主的missing client,最典型的就是jest。 这种客户端可以直接使用dsl语句拼成的字符串,直接传给服务端,然后返回json字符串再解析。最近elasticsearch官网,宣布计划在7.0以后的版本中废除TransportClient,以RestClient为主,所以在官方的RestClient 基础上,进行了简单包装的Jest客户端,就成了首选,而且该客户端也与springboot完美集成。
在pom下引入依赖即可。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/io.searchbox/jest -->
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>5.3.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna -->
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>4.5.1</version>
</dependency>
es的版本选用6.3.1。
elasticsearch对中文分词的支持
es自身携带的中文分词只是单纯将中文一个字一个字分割,并没有词汇的概念,但是在实际的搜索应用中需要分割成词语,这样查询速度和准确度会上升,更贴合实际。如何实现呢?只需要安装中文分词插件即可实现。
分词器下载网址
下载好的zip包,解压后放到es下的plugins目录,重启es即可使用。
elasticsearch的使用
安装完成后,在springboot框架下进行简单的使用,首先配置属性。
#elasticsearch配置
spring.elasticsearch.jest.uris=http://127.0.0.1:9200
数据导入
在es数据库中建立Javabean对应的数据结构,之后导入mysql数据库数据。
public void put() throws IOException {
// 查询mysql数据
List<PmsSkuInfo> pmsSkuInfos = skuService.getAllInfo();
// 转化为es的数据
ArrayList<PmsSearchSkuInfo> pmsSearchSkuInfos = new ArrayList<>();
for (PmsSkuInfo pmsSkuInfo : pmsSkuInfos) {
PmsSearchSkuInfo pmsSearchSkuInfo = new PmsSearchSkuInfo();
BeanUtils.copyProperties(pmsSkuInfo, pmsSearchSkuInfo);
pmsSearchSkuInfos.add(pmsSearchSkuInfo);
}
// 导入es
for (PmsSearchSkuInfo pmsSearchSkuInfo : pmsSearchSkuInfos) {
Index input = new Index.Builder(pmsSearchSkuInfo).index("index_name").type("table_name").id(pmsSearchSkuInfo.getId()).build();
jestClient.execute(input);
}
}
dsl语句建立
搜索引擎中麻烦的是query语句的编写,jest这个客户端包,提供了一组builder工具。
public String getDsl(PmsSearchParam pmsSearchParam){
// 获取搜索属性
String[] pmsSkuAttrValues = pmsSearchParam.getValueId();
String keyword = pmsSearchParam.getKeyword();
String catalog3Id = pmsSearchParam.getCatalog3Id();
// jest的dsl工具
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// bool
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
// filter,防止空指针异常
if (StringUtils.isNotBlank(catalog3Id)){
TermQueryBuilder termQueryBuilder = new TermQueryBuilder("catalog3Id",catalog3Id);
boolQueryBuilder.filter(termQueryBuilder);
}
if(pmsSkuAttrValues!=null){
for (String pmsSkuAttrValue : pmsSkuAttrValues) {
TermQueryBuilder termQueryBuilder = new TermQueryBuilder("skuAttrValueList.valueId",pmsSkuAttrValue);
boolQueryBuilder.filter(termQueryBuilder);
}
}
// must查询
if (StringUtils.isNotBlank(keyword)){
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("skuName",keyword);
boolQueryBuilder.must(matchQueryBuilder);
}
// query,执行查询
SearchSourceBuilder query = searchSourceBuilder.query(boolQueryBuilder);
// 查询的范围限制
query.from(0);
query.size(20);
// 搜索关键词高亮显示
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<span style='color:red;'>");
highlightBuilder.field("skuName");
query.highlight(highlightBuilder);
// 返回字符串格式的查询语句
return query.toString();
}
执行查询
// 用API执行复杂查询
Search search = new Search.Builder(dsl).addIndex("index_name").addType("table_name").build();
SearchResult execute = null;
try {
execute = jestClient.execute(search);
} catch (IOException e) {
e.printStackTrace();
}
execute就是最后查询的返回结果。
至此,关于es的使用就结束了。