Giter VIP home page Giter VIP logo

Comments (13)

FS1360472174 avatar FS1360472174 commented on August 29, 2024

ES使用的是倒排索引(inverted index),与B Tree有什么区别呢

from elasticsearchlearning.

FS1360472174 avatar FS1360472174 commented on August 29, 2024

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.

FS1360472174 avatar FS1360472174 commented on August 29, 2024

明确短语搜索,使用match_phrase代替match

GET /megacorp/employee/_search
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
}
}

from elasticsearchlearning.

FS1360472174 avatar FS1360472174 commented on August 29, 2024

文档metadata
_index 文档存储的地方
_type 文档代表的对象的类
_id 文档的唯一标识

_id是可以自增的,发送请求时使用POST方法,不指定id,而不是PUT方法

from elasticsearchlearning.

FS1360472174 avatar FS1360472174 commented on August 29, 2024

注意点:

  1. 文档不可变,如果需要更改已有的文档,会重建索引,_version会增加

  2. 对于幻读,即一个服务拿到了索引值并修改,另外一个服务拿到的还是老的索引值。
    ES采用乐观锁来解决。如果读写过程中数据发生了变化,更新操作失败,由程序决定如何解决冲突。
    比如重新尝试更新,刷新数据

PUT http://127.0.0.1:9200/website/blog/123?version=2
比如说可以在请求里带上version。如果版本落后了,就会去更新

  1. 文档的新颁布会被平行发送到其他节点,无序的到达目的地。

  2. mget 可以减少访问次数
    一次检索多个文档

5.bulk操作,批量的增删改查
https://es.xiaoleilu.com/030_Data/55_Bulk.html
一个好的批次最好保持在5-15M

from elasticsearchlearning.

FS1360472174 avatar FS1360472174 commented on August 29, 2024

内部实现细节

  1. 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都不会这么设计】

  1. mget 和bulk API 会将多文档请求拆分成对每个分片的请求。
    这点效率绝对差

bulk api不使用JSON数组,而是换行符,就是避免ES再去解析JSON,决定请求到哪个分片。
现在的做法是从网络缓冲区一行一行的直接读取数据,

其他数据库为什么不提供Bulk操作,因为这样的操作虽然减少了client到ES的请求次数,但是单个请求block注了server很久。对ES单个instance的压力也增加了

from elasticsearchlearning.

FS1360472174 avatar FS1360472174 commented on August 29, 2024

search

  1. /_search 全局搜

  2. /db/type/_search 搜
    一个索引有5个主分片和5个索引各有一个分片事实上是一样的

  3. 分页

from:就是skip
size: pagesize

/_search?size = 5&from=5

这边有一个坑就是,(一般db都有)
就是skip10000,pagesize =100
各个节点需要产生自己顶端的10000,+100个,然后合并,排序各个节点,
最后得到100个,丢弃剩下的那么多个。这是为什么搜索结果只返回1000个的原因。

  1. 查询字符串

不建议直接暴露字符串搜索给用户,因为这样会很慢

  • json body

from elasticsearchlearning.

FS1360472174 avatar FS1360472174 commented on August 29, 2024

6. 映射
映射机制将每个字段匹配为一种确定的数据类型

  1. 对于_all是String类型,而单字段会被字段类型进行判断,然后进行索引

  2. ES中的数据包含确切值和全文文本

全文文本是自然语义,需要明白缩写,单复数等
所以ES首先要对文本进行分析,然后建立倒排索引

  1. 分词(tokenizer)

  2. 倒排索引

https://es.xiaoleilu.com/052_Mapping_Analysis/35_Inverted_index.html

  1. 映射

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.

FS1360472174 avatar FS1360472174 commented on August 29, 2024

7.请求体查询

GET /_search
{
"query" : {

  }
}

叶子字句比如match这种,可以将查询字符串与一个字段进行比较
compound,复合子句用以合并其他字句,比如bool,复合字句可以相互嵌套

{
"bool" : {
"must": {"match": {"name": "es"}}
"must_not":
}
}

  1. 过滤
    过滤语法同查询不同,它是问每个文档的字段值是否含有某个特定值。
    查询语句是每个文档的字段值与特定值的匹配度如何

3.重要查询子句
过滤:

  • term 精确匹配
  • terms 多个匹配条件
    {
    “terms” : {
    "tag":["search","full_text"]
    }
    }
  • range 范围
  • bool must,must_not,should 相当于or
    查询
    match,bool
  1. search api只能包含query,所以如果想要query与filter一起
    必须嵌套一层

GET /_search
{
"query": {
"filtered": {
"query": { "match": { "email": "business opportunity" }},
"filter": { "term": { "folder": "inbox" }}
}
}
}

from elasticsearchlearning.

FS1360472174 avatar FS1360472174 commented on August 29, 2024

每个文档都有相关性评分,用一个相对的浮点数字段_score来表示

GET /_search?explain 可以查看评分标准

倒排索引在搜索方面比较卓越,但是却不是理想的排序结构

字段数据:为了提高排序效率,ES将所有字段的值加载到内存中,这叫做数据字段
效率肯定很低啊,内存怎么吃的住3

from elasticsearchlearning.

FS1360472174 avatar FS1360472174 commented on August 29, 2024

分布式搜索:

  1. preference
    控制使用哪个分片或者节点来处理请求,
    如_primary,_primary_first,_local

  2. Bouncing Results
    结果震荡
    如果有两个document有相同的timestamp,
    可能不同的分片钟顺序不一样,这样刷新时就可能有
    结果震荡的问题,

  3. 滚屏和扫描

滚屏允许在一个初始阶段搜索并且持续批量从ES中拉取结果直到没有结果,有点类似
传统数据库里的cursors

滚屏搜索会及时制作快照,

scan:
因为深度分页代价之所以这么高,
就是因为要对结果进行排序。

如果禁用排序,效率就会高。
这就可以使用scan,只要还有结果就返回
(这个如何去重)

GET /index/_search?search_type=scan&scroll=1m

滚屏一分钟

这个请求没有命中的结果,只有一个Base64的_scroll_id字符串

from elasticsearchlearning.

FS1360472174 avatar FS1360472174 commented on August 29, 2024

10.索引管理

可以在config/elasticsearch.yml设置自动索引为false
删除索引

索引 配置

number_of_shards 默认值为5,创建后不能更改
number_of_replicas 默认是1,这个可以动态修改

**问题:**过滤字段是通过fields过滤和_source过滤有何区别

在应用中使用别名而不是索引。然后你就可以在任何时候重建索引。别名的开销很小,应当广泛使用。

from elasticsearchlearning.

FS1360472174 avatar FS1360472174 commented on August 29, 2024

数据不可更改的好处是

  1. 不需要锁了,
  2. 读入到内存中的数据不会失效了

一个新段创建了首先写到内存中,再刷到磁盘里,这个过程是有个时间差的,
所以只能做到近实时搜索。这种先写内存,再刷磁盘的,都有可能会丢失数据,
所以需要事务日志translog 来记录每次操作

optimize API可以强制合并段API,强制分片合并段已达到max_num_segments,将段的数量
减少到1,这样可以提高搜索性能。

from elasticsearchlearning.

Related Issues (17)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.