刘凯雄 096d50dcd3 重新定位版本号,并为mongo重新添加监控埋点 2 years ago
..
src 8fc9ff7dbc 代码升级 3 years ago
README.md 8fc9ff7dbc 代码升级 3 years ago
pom.xml 096d50dcd3 重新定位版本号,并为mongo重新添加监控埋点 2 years ago

README.md

Elab-ES使用手册

环境配置

加载依赖

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

开启ES功能

SpringBoot的启动类上加入@EnableESTools

配置文件中加入

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

如果有多个(集群情况)请用半角逗号,隔开

索引映射

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的文档搜索查询字符串打印出来

业务中使用

加入模版操作类

@Autowired
DefaultElasticSearchTemplate<Main2,String> elasticsearchTemplate;

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

Main2 : 映射ES的实体类

String : 主键

@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;

新增数据

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

批量新增数据

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);

部分更新索引数据

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

判断索引是否存在

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

原生查询

原生查询

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

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);
}

高级查询

参考文档

高亮查询

关于集成Spring-jdbc记录:

  1. 尝试过使用 ElasticSearch-sql去做SQL转换,兼容Druid数据源等等。但是由于ES以后的版本都只会往RestHighLevelClient靠,但是该框架又是基于老的Client接口去做的,8.0版本之后会被移除,所以还得看看其他方式
  2. 使用ElasticSearch-sql的另一个版本elasticsearch-sql 该版本基于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兼容性好。

可以将这几种结合一下。