精彩文章
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
}
}
}
}