Comments (13)
ES使用的是倒排索引(inverted index),与B Tree有什么区别呢
from elasticsearchlearning.
ES 暴露出来的API,get方法也可以提供JSON body
GET /megacorp/employee/_search
{
"query" : {
"match" : {
"last_name" : "Smith"
}
}
}
之前都是要用POST方法,这个是如何做到的
https://es.xiaoleilu.com/054_Query_DSL/55_Request_body_search.html
http://tools.ietf.org/html/rfc7231#page-24[RFC 7231] 并未规定HTTP语义在
GET请求中允许携带Body。所以有些HTTP服务允许,
ES使用GET请求可以带body。但是因为这种GET请求并没有被广泛支持,所以同样支持
POST请求
from elasticsearchlearning.
明确短语搜索,使用match_phrase代替match
GET /megacorp/employee/_search
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
}
}
from elasticsearchlearning.
文档metadata
_index 文档存储的地方
_type 文档代表的对象的类
_id 文档的唯一标识
_id是可以自增的,发送请求时使用POST方法,不指定id,而不是PUT方法
from elasticsearchlearning.
注意点:
-
文档不可变,如果需要更改已有的文档,会重建索引,_version会增加
-
对于幻读,即一个服务拿到了索引值并修改,另外一个服务拿到的还是老的索引值。
ES采用乐观锁来解决。如果读写过程中数据发生了变化,更新操作失败,由程序决定如何解决冲突。
比如重新尝试更新,刷新数据
PUT http://127.0.0.1:9200/website/blog/123?version=2
比如说可以在请求里带上version。如果版本落后了,就会去更新
-
文档的新颁布会被平行发送到其他节点,无序的到达目的地。
-
mget 可以减少访问次数
一次检索多个文档
5.bulk操作,批量的增删改查
https://es.xiaoleilu.com/030_Data/55_Bulk.html
一个好的批次最好保持在5-15M
from elasticsearchlearning.
内部实现细节
-
sharding
shard = hash(route_id)%number_of_primary_shards
主分片的数量在创建索引时定义时不能更改
ES不支持rebalance
route_id默认是_id但也可以自定义,因为需要将某一类的文档定义到同一分片中。
文档API支持routing参数
(注:这个应该是一个可以优化点,如果不指定route_id,那意味着范围查询支持不够好)
???shard 数量是如何计算的
2. replication
复制默认是sync。 就是请求必须要得到复制分片成功响应才算
不建议改成async,因为这样会导致其他接受更多的请求,而是es过载
https://es.xiaoleilu.com/040_Distributed_CRUD/15_Create_index_delete.html
【这条完全是坑爹啊,mongo,cassandra都不会这么设计】
- mget 和bulk API 会将多文档请求拆分成对每个分片的请求。
这点效率绝对差
bulk api不使用JSON数组,而是换行符,就是避免ES再去解析JSON,决定请求到哪个分片。
现在的做法是从网络缓冲区一行一行的直接读取数据,
其他数据库为什么不提供Bulk操作,因为这样的操作虽然减少了client到ES的请求次数,但是单个请求block注了server很久。对ES单个instance的压力也增加了
from elasticsearchlearning.
search
-
/_search 全局搜
-
/db/type/_search 搜
一个索引有5个主分片和5个索引各有一个分片事实上是一样的 -
分页
from:就是skip
size: pagesize
/_search?size = 5&from=5
这边有一个坑就是,(一般db都有)
就是skip10000,pagesize =100
各个节点需要产生自己顶端的10000,+100个,然后合并,排序各个节点,
最后得到100个,丢弃剩下的那么多个。这是为什么搜索结果只返回1000个的原因。
- 查询字符串
- 字符串 (http://127.0.0.1:9200/_search?q=first)
默认会有一个叫_all的额外字段值,不指定字段的时候,默认就是_all字段
不建议直接暴露字符串搜索给用户,因为这样会很慢
- json body
from elasticsearchlearning.
6. 映射
映射机制将每个字段匹配为一种确定的数据类型
-
对于_all是String类型,而单字段会被字段类型进行判断,然后进行索引
-
ES中的数据包含确切值和全文文本
全文文本是自然语义,需要明白缩写,单复数等
所以ES首先要对文本进行分析,然后建立倒排索引
-
分词(tokenizer)
-
倒排索引
https://es.xiaoleilu.com/052_Mapping_Analysis/35_Inverted_index.html
- 映射
JSON type Field type
Boolean: true or false "boolean"
Whole number: 123 "long"
Floating point: 123.45 "double"
String, valid date: "2014-09-15" "date"
String: "foo bar" "string"
数组,会根据第一个值类型来判断,所以要确保数组中的数据类型一致
from elasticsearchlearning.
7.请求体查询
GET /_search
{
"query" : {
}
}
叶子字句比如match这种,可以将查询字符串与一个字段进行比较
compound,复合子句用以合并其他字句,比如bool,复合字句可以相互嵌套
{
"bool" : {
"must": {"match": {"name": "es"}}
"must_not":
}
}
- 过滤
过滤语法同查询不同,它是问每个文档的字段值是否含有某个特定值。
查询语句是每个文档的字段值与特定值的匹配度如何
3.重要查询子句
过滤:
- term 精确匹配
- terms 多个匹配条件
{
“terms” : {
"tag":["search","full_text"]
}
} - range 范围
- bool must,must_not,should 相当于or
查询
match,bool
- search api只能包含query,所以如果想要query与filter一起
必须嵌套一层
GET /_search
{
"query": {
"filtered": {
"query": { "match": { "email": "business opportunity" }},
"filter": { "term": { "folder": "inbox" }}
}
}
}
from elasticsearchlearning.
每个文档都有相关性评分,用一个相对的浮点数字段_score来表示
GET /_search?explain 可以查看评分标准
倒排索引在搜索方面比较卓越,但是却不是理想的排序结构
字段数据:为了提高排序效率,ES将所有字段的值加载到内存中,这叫做数据字段
效率肯定很低啊,内存怎么吃的住3
from elasticsearchlearning.
分布式搜索:
-
preference
控制使用哪个分片或者节点来处理请求,
如_primary,_primary_first,_local -
Bouncing Results
结果震荡
如果有两个document有相同的timestamp,
可能不同的分片钟顺序不一样,这样刷新时就可能有
结果震荡的问题, -
滚屏和扫描
滚屏允许在一个初始阶段搜索并且持续批量从ES中拉取结果直到没有结果,有点类似
传统数据库里的cursors
滚屏搜索会及时制作快照,
scan:
因为深度分页代价之所以这么高,
就是因为要对结果进行排序。
如果禁用排序,效率就会高。
这就可以使用scan,只要还有结果就返回
(这个如何去重)
GET /index/_search?search_type=scan&scroll=1m
滚屏一分钟
这个请求没有命中的结果,只有一个Base64的_scroll_id字符串
from elasticsearchlearning.
10.索引管理
可以在config/elasticsearch.yml设置自动索引为false
删除索引
索引 配置
number_of_shards 默认值为5,创建后不能更改
number_of_replicas 默认是1,这个可以动态修改
**问题:**过滤字段是通过fields过滤和_source过滤有何区别
在应用中使用别名而不是索引。然后你就可以在任何时候重建索引。别名的开销很小,应当广泛使用。
from elasticsearchlearning.
数据不可更改的好处是
- 不需要锁了,
- 读入到内存中的数据不会失效了
一个新段创建了首先写到内存中,再刷到磁盘里,这个过程是有个时间差的,
所以只能做到近实时搜索。这种先写内存,再刷磁盘的,都有可能会丢失数据,
所以需要事务日志translog 来记录每次操作
optimize API可以强制合并段API,强制分片合并段已达到max_num_segments,将段的数量
减少到1,这样可以提高搜索性能。
from elasticsearchlearning.
Related Issues (17)
- elastic search 相关结构名词 HOT 3
- ES 与db 本身提供的索引查询有和区别 HOT 2
- 为什么在REST API 中 HOT 1
- DSL 查询语句 HOT 1
- es 是全量索引?
- es 翻页
- es 按照时间,7天为区间聚合
- es distinct 不可以
- es 过滤null值 HOT 1
- 聚合以后分页
- elastic search 不支持聚合求和,再过滤值?
- 文本检索
- 删除文档
- 倒排索引的并发为什么差
- 数据更新的方式
- 同步源数据到索引数据表 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from elasticsearchlearning.