# Elab-ES使用手册

## 环境配置

### 加载依赖

```xml
<dependency>
    <groupId>com.elab.core</groupId>
    <artifactId>elab-es</artifactId>
    <version>${project.version}</version>
</dependency>
```

### 开启ES功能

SpringBoot的启动类上加入`@EnableESTools`

配置文件中加入



```yml
spring.elasticsearch.rest.uris=http://192.168.0.24:9200
```

如果有多个（集群情况）请用半角逗号```,```隔开



### 索引映射

```java
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.zxp.esclientrhl.annotation.ESMetaData;

import java.io.Serializable;
import java.util.Date;

/**
 * 用户entity
 *
 * @author ： liukx
 * @time ： 2019/8/1 - 11:40
 */
@ESMetaData(indexName = "索引名称", indexType = "类型名称", number_of_shards = 5, number_of_replicas = 0,
        printLog = true)
public class UserTable implements Serializable {
	// 对应字段
    private String doc_id;
    private String title;
    private String message;
    private Date postDate;

    private HighlightField highlightField;

    public HighlightField getHighlightField() {
        return highlightField;
    }

    public void setHighlightField(HighlightField highlightField) {
        this.highlightField = highlightField;
    }

    public String getDoc_id() {
        return doc_id;
    }

    public void setDoc_id(String doc_id) {
        this.doc_id = doc_id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Date getPostDate() {
        return postDate;
    }

    public void setPostDate(Date postDate) {
        this.postDate = postDate;
    }

    @Override
    public String toString() {
        return "UserTable{" +
                "doc_id='" + doc_id + '\'' +
                ", title='" + title + '\'' +
                ", message='" + message + '\'' +
                ", postDate=" + postDate +
                ", highlightField=" + highlightField +
                '}';
    }
}
```

`indexName` : 类似于Mysql的数据库名称

`indexType`: 类似于Mysql的表名称

`printLog` : 是否打印日志，这个东西会将请求的参数转换成ES的文档搜索查询字符串打印出来

### 业务中使用

加入模版操作类

```java
@Autowired
DefaultElasticSearchTemplate<Main2,String> elasticsearchTemplate;
```

这里是引入ES操作的模版类。

**Main2** : 映射ES的实体类

String : 主键

```java
@ESMetaData(indexName = "index",indexType = "main", number_of_shards = 5,number_of_replicas = 0)
public class Main2 implements Serializable {
    private static final long serialVersionUID = 1L;
    @ESID
    private String proposal_no;
```


#### 新增数据

```java
Main2 main = new Main2();
main.setProposal_no("main2");
main.setAppli_code("123");
main.setAppli_name("456");
elasticsearchTemplate.save(main);
```

#### 批量新增数据

```java
List<Main2> list = new ArrayList<>();
Main2 main1 = new Main2();
main1.setProposal_no("main1");
main1.setAppli_code("123");
main1.setAppli_name("456");
Main2 main2 = new Main2();
main2.setProposal_no("main2");
main2.setAppli_code("123");
main2.setAppli_name("456");
Main2 main3 = new Main2();
main3.setProposal_no("main3");
main3.setAppli_code("123");
main3.setAppli_name("456");
list.add(main1);
list.add(main2);
list.add(main3);
elasticsearchTemplate.save(list);
```

####  部分更新索引数据

```java
Main2 main1 = new Main2();
main1.setProposal_no("main1");
main1.setInsured_code("123");
elasticsearchTemplate.update(main1);
```

#### 判断索引是否存在

```java
Main2 main1 = new Main2();
main1.setProposal_no("main1");
main1.setInsured_code("123");
boolean exists = elasticsearchTemplate.exists("main1",Main2.class);
System.out.println(exists);
```

原生查询

####  原生查询

searchRequest是官方原生查询输入，此方法在工具无法满足需求时使用

```java
SearchRequest searchRequest = new SearchRequest(new String[]{"index"});
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(new MatchAllQueryBuilder());
searchSourceBuilder.from(0);
searchSourceBuilder.size(10);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = elasticsearchTemplate.search(searchRequest);

SearchHits hits = searchResponse.getHits();
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
    Main2 t = JsonUtils.string2Obj(hit.getSourceAsString(), Main2.class);
    System.out.println(t);
}
```

#### 高级查询

[参考文档](https://gitee.com/zxporz/ESClientRHL)

#### 高亮查询
## 关于集成Spring-jdbc记录:

1. 尝试过使用 [ElasticSearch-sql](https://github.com/NLPchina/elasticsearch-sql)去做SQL转换，兼容Druid数据源等等。但是由于ES以后的版本都只会往**RestHighLevelClient**靠，但是该框架又是基于老的`Client`接口去做的，8.0版本之后会被移除，所以还得看看其他方式
2. 使用ElasticSearch-sql的另一个版本[elasticsearch-sql](https://github.com/iamazy/elasticsearch-sql/wiki/Jdbc) 该版本基于SQL的转换做了非常多的兼容，包括SQL转DSL，包括SQL转DSL的String对象，对于JDBC的操作也支持的算到位吧，结果集可能需要根据需求转换一下。但是对于复杂的SQL条件，例如`1=1` 可能还是兼容不够好。但是功能还是挺丰富的，比如高亮、GEO、嵌套等等
   1. https://github.com/iamazy/elasticsearch-sql2  还可以参考一下这个文档
3. 如果使用RestHighLevelClient高版本的去做也没啥问题,也就是将SQL作为明文参数直接传递给ES去解析，利用SQL插件去查找，功能会稍微简单，可能就是不会支持高亮、GEO等等高级搜索。功能比较简单。SQL兼容性好。

可以将这几种结合一下。





