精彩文章
https://www.infoq.cn/article/qb1al5vrkolu3fma3oki
官方文档
ES权威指南 https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
Java API:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html
带着问题
ES看起来既能支持类似关系型数据库的sql查询,以及聚合查询,还能支持搜索。那么是否可以完全代替关系型数据库呢?
- 不能。ES在大数据量的查询场景确实有优势,但不支持ACID,而且更新使用乐观锁,严格要求ACID事务的场景 必须还是使用关系型数据库

更新操作
- ES不支持直接的update能力,底层实际实现都是先删再插
- 从旧文档构建 JSON
- 更改该 JSON
- 删除旧文档
- 索引一个新文档
处理冲突

在数据库领域中,有两种方法通常被用来确保并发更新时变更不会丢失:
悲观并发控制
这种方法被关系型数据库广泛使用,它假定有变更冲突可能发生,因此阻塞访问资源以防止冲突。 一个典型的例子是读取一行数据之前先将其锁住,确保只有放置锁的线程能够对这行数据进行修改。
乐观并发控制
Elasticsearch 中使用的这种方法假定冲突是不可能发生的,并且不会阻塞正在尝试的操作。 然而,如果源数据在读写当中被修改,更新将会失败。应用程序接下来将决定该如何解决冲突。 例如,可以重试更新、使用新的数据、或者将相关情况报告给用户。
具体乐观并发控制的实现方法:版本号
https://www.elastic.co/guide/cn/elasticsearch/guide/current/optimistic-concurrency-control.html 所有文档的更新或删除 API,都可以接受 version 参数,这允许你在代码中使用乐观的并发控制,这是一种明智的做法。
查询方式
能支持的查询方式 都在这里可以看到

must / must not / should 分别表达 and、not、or
https://www.elastic.co/guide/cn/elasticsearch/guide/current/combining-filters.html
Java客户端
QuerBuilder的使用
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-query-builders.html
一个查询case
GET /lumos_kol_list_weibo/_search{"query": {"bool": {"must": [{"term": {"valid": {"value": 1}}},{"bool": {"should": [{"match": {"media_name_text": {"query": "薇娅","boost": 10}}},{"match": {"description": {"query": "薇娅","boost": 1}}}]}}], "must_not": [{"term": {"channel": {"value": "TOUTIAO"}}}]}},"sort": [{"talent_type": {"order": "asc"},"fans_cnt": {"order": "desc"},"_score": {"order": "desc"}}]}
提升受欢迎度权重
https://www.elastic.co/guide/cn/elasticsearch/guide/current/boosting-by-popularity.html
场景:
GET /lumos_kol_list_weibo/_search{"query": {"function_score": {"query": {"bool": {"must": [{"term": {"valid": {"value": 1}}},{"bool": {"should": [{"match": {"media_name_text": {"query": "薇娅","boost": 10}}}]}}], "must_not": [{"term": {"channel": {"value": "TOUTIAO"}}}]}},"field_value_factor": {"field": "fans_cnt","modifier": "log1p","factor": 0.1}}}}
