精彩文章

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事务的场景 必须还是使用关系型数据库
  • image.png

更新操作

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

处理冲突

image.png
在数据库领域中,有两种方法通常被用来确保并发更新时变更不会丢失:
悲观并发控制
这种方法被关系型数据库广泛使用,它假定有变更冲突可能发生,因此阻塞访问资源以防止冲突。 一个典型的例子是读取一行数据之前先将其锁住,确保只有放置锁的线程能够对这行数据进行修改。
乐观并发控制
Elasticsearch 中使用的这种方法假定冲突是不可能发生的,并且不会阻塞正在尝试的操作。 然而,如果源数据在读写当中被修改,更新将会失败。应用程序接下来将决定该如何解决冲突。 例如,可以重试更新、使用新的数据、或者将相关情况报告给用户。

具体乐观并发控制的实现方法:版本号

https://www.elastic.co/guide/cn/elasticsearch/guide/current/optimistic-concurrency-control.html 所有文档的更新或删除 API,都可以接受 version 参数,这允许你在代码中使用乐观的并发控制,这是一种明智的做法。

查询方式

能支持的查询方式 都在这里可以看到
image.png

此外需要注意的是,ES是支持聚合操作的,非常强大
image.png

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

  1. GET /lumos_kol_list_weibo/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": [{"term": {
  6. "valid": {
  7. "value": 1
  8. }
  9. }},
  10. {"bool": {
  11. "should": [
  12. {"match": {
  13. "media_name_text": {
  14. "query": "薇娅",
  15. "boost": 10
  16. }
  17. }},
  18. {
  19. "match": {
  20. "description": {
  21. "query": "薇娅",
  22. "boost": 1
  23. }
  24. }
  25. }
  26. ]
  27. }}
  28. ]
  29. , "must_not": [
  30. {"term": {
  31. "channel": {
  32. "value": "TOUTIAO"
  33. }
  34. }}
  35. ]
  36. }
  37. },
  38. "sort": [
  39. {
  40. "talent_type": {
  41. "order": "asc"
  42. },
  43. "fans_cnt": {
  44. "order": "desc"
  45. },"_score": {
  46. "order": "desc"
  47. }
  48. }
  49. ]
  50. }

提升受欢迎度权重

https://www.elastic.co/guide/cn/elasticsearch/guide/current/boosting-by-popularity.html
场景:
image.png

  1. GET /lumos_kol_list_weibo/_search
  2. {
  3. "query": {
  4. "function_score": {
  5. "query": {
  6. "bool": {
  7. "must": [{"term": {
  8. "valid": {
  9. "value": 1
  10. }
  11. }},
  12. {"bool": {
  13. "should": [
  14. {"match": {
  15. "media_name_text": {
  16. "query": "薇娅",
  17. "boost": 10
  18. }
  19. }}
  20. ]
  21. }}
  22. ]
  23. , "must_not": [
  24. {"term": {
  25. "channel": {
  26. "value": "TOUTIAO"
  27. }
  28. }}
  29. ]
  30. }
  31. },
  32. "field_value_factor": {
  33. "field": "fans_cnt",
  34. "modifier": "log1p",
  35. "factor": 0.1
  36. }
  37. }
  38. }
  39. }