快速入门
<p>nisbos平台封装nisbos-es-client工具包,方便大家快速入门使用。</p>
<h3>一、nisbos-es-client简介</h3>
<p><a href="https://www.showdoc.cc/chlingm?page_id=4174528878366027" title="nisbos-es-client简介">nisbos-es-client简介</a></p>
<h3>二、项目使用nisbos-es-client前置条件</h3>
<ul>
<li>项目是基于springboot开发</li>
<li>项目使用的jdk版本为jdk8+</li>
<li>elasticsearch的服务器版本为6.6.0</li>
</ul>
<h3>三、快速入门</h3>
<blockquote>
<p>1、pom.xml 引入</p>
</blockquote>
<pre><code class="language-java"><!--防止es客户端版本被覆盖-->
<properties>
<elasticsearch.version>6.6.0</elasticsearch.version>
</properties>
</dependency>
<dependency>
<groupId>com.nisbos</groupId>
<artifactId>nisbos-es-client</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency></code></pre>
<blockquote>
<p>2、application.yml配置es服务端端口ip信息</p>
</blockquote>
<pre><code class="language-java">elasticsearch:
host: 10.1.4.70:9200,10.1.4.71:9200
username: elastic
password: 111111</code></pre>
<blockquote>
<p>3、在需要进行全文检索的实体上加上nisbos-es-client相关注解,使用这些注解可以帮大家把实体的字段信息存入es服务器中</p>
</blockquote>
<p>示例代码</p>
<pre><code class="language-java">@ESMetaData(indexName = "pingan",indexType = "baodan", number_of_shards = 5,number_of_replicas = 0,printLog = false)
public class BaoDanModel implements Serializable {
private static final long serialVersionUID = 1L;
@ESID
private String proposal_no;
@ESMapping(datatype = DataType.keyword_type)
private String risk_code;
@ESMapping(datatype = DataType.text_type)
private String risk_name;
@ESMapping(keyword = true)
private String business_nature;
@ESMapping(datatype = DataType.text_type)
private String business_nature_name;
private String appli_code;//可以用默认值,这样会有appli_code.keyword可以直接搜
@ESMapping(suggest = true)
private String appli_name;
private String insured_code;
@ESMapping(autocomplete = true)
private String insured_name;
@ESMapping(datatype = DataType.date_type)
private Date operate_date;
@ESMapping(datatype = DataType.text_type)
private String operate_date_format;
@ESMapping(datatype = DataType.date_type)
private Date start_date;
@ESMapping(datatype = DataType.date_type)
private Date end_date;
@ESMapping(datatype = DataType.double_type)
private double sum_amount;
@ESMapping(datatype = DataType.double_type)
private double sum_premium;
@ESMapping(datatype = DataType.keyword_type)
private String com_code;
public String getProposal_no() {
return proposal_no;
}
public void setProposal_no(String proposal_no) {
this.proposal_no = proposal_no;
}
public String getRisk_code() {
return risk_code;
}
public void setRisk_code(String risk_code) {
this.risk_code = risk_code;
}
public String getRisk_name() {
return risk_name;
}
public void setRisk_name(String risk_name) {
this.risk_name = risk_name;
}
public String getBusiness_nature() {
return business_nature;
}
public void setBusiness_nature(String business_nature) {
this.business_nature = business_nature;
}
public String getBusiness_nature_name() {
return business_nature_name;
}
public void setBusiness_nature_name(String business_nature_name) {
this.business_nature_name = business_nature_name;
}
public String getAppli_code() {
return appli_code;
}
public void setAppli_code(String appli_code) {
this.appli_code = appli_code;
}
public String getAppli_name() {
return appli_name;
}
public void setAppli_name(String appli_name) {
this.appli_name = appli_name;
}
public String getInsured_code() {
return insured_code;
}
public void setInsured_code(String insured_code) {
this.insured_code = insured_code;
}
public String getInsured_name() {
return insured_name;
}
public void setInsured_name(String insured_name) {
this.insured_name = insured_name;
}
public Date getOperate_date() {
return operate_date;
}
public void setOperate_date(Date operate_date) {
this.operate_date = operate_date;
}
public Date getStart_date() {
return start_date;
}
public void setStart_date(Date start_date) {
this.start_date = start_date;
}
public Date getEnd_date() {
return end_date;
}
public void setEnd_date(Date end_date) {
this.end_date = end_date;
}
public double getSum_amount() {
return sum_amount;
}
public void setSum_amount(double sum_amount) {
this.sum_amount = sum_amount;
}
public double getSum_premium() {
return sum_premium;
}
public void setSum_premium(double sum_premium) {
this.sum_premium = sum_premium;
}
public String getCom_code() {
return com_code;
}
public void setCom_code(String com_code) {
this.com_code = com_code;
}
public String getOperate_date_format() {
return operate_date_format;
}
public void setOperate_date_format(String operate_date_format) {
this.operate_date_format = operate_date_format;
}
@Override
public String toString() {
return "Main2{" +
", proposal_no='" + proposal_no + '\'' +
", risk_code='" + risk_code + '\'' +
", risk_name='" + risk_name + '\'' +
", business_nature='" + business_nature + '\'' +
", business_nature_name='" + business_nature_name + '\'' +
", appli_code='" + appli_code + '\'' +
", appli_name='" + appli_name + '\'' +
", insured_code='" + insured_code + '\'' +
", insured_name='" + insured_name + '\'' +
", operate_date=" + operate_date +
", operate_date_format='" + operate_date_format + '\'' +
", start_date=" + start_date +
", end_date=" + end_date +
", sum_amount=" + sum_amount +
", sum_premium=" + sum_premium +
", com_code='" + com_code + '\'' +
'}';
}
}
</code></pre>
<table>
<thead>
<tr>
<th>注解名称</th>
<th>注解作用</th>
<th>注解属性</th>
</tr>
</thead>
<tbody>
<tr>
<td>ESMetaData</td>
<td>es索引元数据的注解</td>
<td>indexName :索引名称,必须配置;indexType :索引类型,必须配置;number_of_shards :主分片数量;number_of_replicas :备份分片数量;printLog:是否打印日志</td>
</tr>
<tr>
<td>ESID</td>
<td>标识主键</td>
<td>无</td>
</tr>
<tr>
<td>ESMapping</td>
<td>对应es索引结构的注解</td>
<td>datatype:数据类型,类型支持keyword_type,text_type,byte_type,short_type,integer_type,long_type,float_type,double_type,boolean_type,date_type;keyword:间接关键字;autocomplete:全文搜索提示; suggest :前缀搜索提示</td>
</tr>
</tbody>
</table>
<blockquote>
<p>4、对索引的管理</p>
</blockquote>
<p>主要是根据com.nisbos.es.index.ElasticsearchIndex进行实现</p>
<ul>
<li>
<p>4.1 新建索引</p>
<p>项目启动后,会根据实体上的注解,生成相关索引,比如以BaoDanModel为例,项目一启动,项目就会在es服务器那边生成索引为pingan的索引</p>
</li>
<li>4.2 判断索引是否存在</li>
</ul>
<p>示例代码</p>
<pre><code class="language-java">try {
elasticsearchIndex.exists(BaoDanModel.class);
} catch (Exception e) {
e.printStackTrace();
}</code></pre>
<ul>
<li>4.3 删除索引</li>
</ul>
<p>示例代码</p>
<pre><code class="language-java">try {
elasticsearchIndex.dropIndex(BaoDanModel.class);
} catch (Exception e) {
e.printStackTrace();
}</code></pre>
<blockquote>
<p>5、索引数据增删改查</p>
</blockquote>
<p>主要根据com.nisbos.es.repository.ElasticsearchTemplate进行实现</p>
<ul>
<li>
<p>5.1 数据新增</p>
<p>a、单个新增</p>
<p>示例代码</p>
<pre><code class="language-java">BaoDanModel main1 = new BaoDanModel();
main1.setProposal_no("main11");
main1.setAppli_code("123");
main1.setAppli_name("spring");
main1.setRisk_code("0501");
main1.setSum_premium(100);
elasticsearchTemplate.save(main1);</code></pre>
<p>b、批量新增</p>
<p>示例代码</p>
<pre><code class="language-java">List<BaoDanModel> list = new ArrayList<>();
BaoDanModel main1 = new BaoDanModel();
main1.setProposal_no("main1");
main1.setAppli_name("456");
main1.setRisk_code("0101");
main1.setSum_premium(1);
BaoDanModel BaoDanModel = new BaoDanModel();
BaoDanModel.setProposal_no("BaoDanModel");
BaoDanModel.setAppli_name("456");
BaoDanModel.setSum_premium(2);
BaoDanModel.setRisk_code("0102");
BaoDanModel main3 = new BaoDanModel();
main3.setProposal_no("main3");
main3.setRisk_code("0103");
main3.setSum_premium(3);
main3.setAppli_name("456");
BaoDanModel main4 = new BaoDanModel();
main4.setProposal_no("33333333");
main4.setRisk_code("0103");
main4.setSum_premium(4);
main4.setAppli_name("123");
BaoDanModel main5 = new BaoDanModel();
main5.setProposal_no("11111111");
main5.setRisk_code("0103");
main5.setAppli_name("123");
main5.setSum_premium(5);
BaoDanModel main6 = new BaoDanModel();
main6.setProposal_no("22222222");
main6.setRisk_code("0103");
main6.setAppli_name("123");
main6.setSum_premium(6);
list.add(main1);
list.add(BaoDanModel);
list.add(main3);
list.add(main4);
list.add(main5);
list.add(main6);
elasticsearchTemplate.save(list);</code></pre>
</li>
<li>5.2 数据更新</li>
</ul>
<p>示例代码</p>
<pre><code class="language-java">BaoDanModel main1 = new BaoDanModel();
main1.setProposal_no("main1");
main1.setInsured_code("123");
elasticsearchTemplate.update(main1);</code></pre>
<ul>
<li>5.3 数据删除</li>
</ul>
<p>示例代码</p>
<pre><code class="language-java">BaoDanModel main1 = new BaoDanModel();
main1.setProposal_no("main1");
main1.setInsured_code("123");
elasticsearchTemplate.delete(main1);</code></pre>
<ul>
<li>5.4 查询</li>
</ul>
<p>a、不分词查询</p>
<p>示例代码</p>
<pre><code class="language-java">QueryBuilder queryBuilder = QueryBuilders.termQuery("appli_name.keyword","456");
List<BaoDanModel> list = elasticsearchTemplate.search(queryBuilder,BaoDanModel.class);
list.forEach(BaoDanModel -> System.out.println(BaoDanModel));
}</code></pre>
<p>b、分词查询</p>
<p>示例代码</p>
<pre><code class="language-java">QueryBuilder queryBuilder = QueryBuilders.matchQuery("appli_name","中男儿");
List<BaoDanModel> list = elasticsearchTemplate.search(queryBuilder,BaoDanModel.class);
list.forEach(BaoDanModel -> System.out.println(BaoDanModel));</code></pre>
<p>c、正则查询</p>
<p>示例代码</p>
<pre><code class="language-java"> QueryBuilder queryBuilder = QueryBuilders.regexpQuery("appli_name","[0-9].+");
List<BaoDanModel> list = elasticsearchTemplate.search(queryBuilder,BaoDanModel.class);
list.forEach(BaoDanModel -> System.out.println(BaoDanModel));</code></pre>
<p>d、布尔查询(或、与、非查询)</p>
<p>示例代码</p>
<pre><code class="language-java">QueryBuilder queryBuilder1 = QueryBuilders.termQuery("appli_name.keyword","spring");
QueryBuilder queryBuilder2 = QueryBuilders.termQuery("appli_name.keyword","456");
QueryBuilder queryBuilder3 = QueryBuilders.termQuery("risk_code","0101");
QueryBuilder queryBuilder4 = QueryBuilders.termQuery("proposal_no.keyword","1234567");
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.should(queryBuilder1).should(queryBuilder2);
queryBuilder.must(queryBuilder3);
queryBuilder.mustNot(queryBuilder4);
List<BaoDanModel> list = elasticsearchTemplate.search(queryBuilder,BaoDanModel.class);
list.forEach(BaoDanModel -> System.out.println(BaoDanModel));</code></pre>
<p>e、分页查询</p>
<p>示例代码</p>
<pre><code class="language-java">int currentPage = 1;
int pageSize = 10;
//分页
PageSortHighLight psh = new PageSortHighLight(currentPage,pageSize);
//排序
//排序字段,注意如果proposal_no是text类型会默认带有keyword性质,需要拼接.keyword
//精准查询的字段需要设置keyword属性(默认该属性为true),查询时fieldname需要带上.keyword
String sorter = "proposal_no.keyword";
Sort.Order order = new Sort.Order(SortOrder.ASC,sorter);
psh.setSort(new Sort(order));
//定制高亮,如果定制了高亮,返回结果会自动替换字段值为高亮内容
psh.setHighLight(new HighLight().field("appli_name"));
//可以单独定义高亮的格式
//new HighLight().setPreTag("<em>");
//new HighLight().setPostTag("</em>");
PageList<BaoDanModel> pageList = new PageList<>();
pageList = elasticsearchTemplate.search(QueryBuilders.matchQuery("appli_name","阿斯达岁"), psh, BaoDanModel.class);
pageList.getList().forEach(BaoDanModel -> System.out.println(BaoDanModel));
</code></pre>
<h3>四、Q&A</h3>
<blockquote>
<p>4.1 出现Caused by: java.lang.NoClassDefFoundError: [Lorg/elasticsearch/search/aggregations/bucket/filter/FiltersAggregator$KeyedFilter;</p>
</blockquote>
<p>可能是es客户端的版本被覆盖了,只需在项目中pom.xml引入</p>
<pre><code class="language-java"> <properties>
<elasticsearch.version>6.6.0</elasticsearch.version>
</properties></code></pre>
<blockquote>
<p>4.2 是否支持部分字段索引到es,因为有些敏感信息不想被检索到?</p>
</blockquote>
<p>支持,只需在实体映射的字段上加上,保存数据采用批量保存的方式。</p>
<pre><code class="language-java"> @ESMapping(ignore_field = true)</code></pre>
<blockquote>
<p>4.3 如果原来项目已经使用es,且es服务器版本低于或者高于6版本,能否使用nisbos-es-client?</p>
</blockquote>
<p>低版本目前不支持,高版本目前支持</p>