nisbos


快速入门

<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">&lt;!--防止es客户端版本被覆盖--&gt; &lt;properties&gt; &lt;elasticsearch.version&gt;6.6.0&lt;/elasticsearch.version&gt; &lt;/properties&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;com.nisbos&lt;/groupId&gt; &lt;artifactId&gt;nisbos-es-client&lt;/artifactId&gt; &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt; &lt;/dependency&gt;</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&lt;BaoDanModel&gt; list = new ArrayList&lt;&gt;(); 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&lt;BaoDanModel&gt; list = elasticsearchTemplate.search(queryBuilder,BaoDanModel.class); list.forEach(BaoDanModel -&gt; System.out.println(BaoDanModel)); }</code></pre> <p>b、分词查询</p> <p>示例代码</p> <pre><code class="language-java">QueryBuilder queryBuilder = QueryBuilders.matchQuery("appli_name","中男儿"); List&lt;BaoDanModel&gt; list = elasticsearchTemplate.search(queryBuilder,BaoDanModel.class); list.forEach(BaoDanModel -&gt; 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&lt;BaoDanModel&gt; list = elasticsearchTemplate.search(queryBuilder,BaoDanModel.class); list.forEach(BaoDanModel -&gt; 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&lt;BaoDanModel&gt; list = elasticsearchTemplate.search(queryBuilder,BaoDanModel.class); list.forEach(BaoDanModel -&gt; 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("&lt;em&gt;"); //new HighLight().setPostTag("&lt;/em&gt;"); PageList&lt;BaoDanModel&gt; pageList = new PageList&lt;&gt;(); pageList = elasticsearchTemplate.search(QueryBuilders.matchQuery("appli_name","阿斯达岁"), psh, BaoDanModel.class); pageList.getList().forEach(BaoDanModel -&gt; System.out.println(BaoDanModel)); </code></pre> <h3>四、Q&amp;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"> &lt;properties&gt; &lt;elasticsearch.version&gt;6.6.0&lt;/elasticsearch.version&gt; &lt;/properties&gt;</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>

页面列表

ITEM_HTML