You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Term Doc_1 Doc_2
-------------------------
Quick | | X
The | X |
brown | X | X
dog | X |
dogs | | X
fox | X |
foxes | | X
in | | X
jumped | X |
lazy | X | X
leap | | X
over | X | X
quick | X |
summer | | X
the | X |
------------------------
如果对同义词和相同词根的词进行合并的话
Term Doc_1 Doc_2
-------------------------
brown | X | X
dog | X | X
fox | X | X
in | | X
jump | X | X
lazy | X | X
over | X | X
quick | X | X
summer | | X
the | X | X
------------------------
curl -X GET "http://localhost:9200/_cat/indices?v"
查看一个 index 的信息
curl -X GET "http://localhost:9200/_cat/indices/tests"
删除一个索引
curl -X DELETE "http://127.0.0.1:9200/tests"
查看 tests 索引下的 test 类型下的所有数据
curl -X GET "http://127.0.0.1:9200/tests/test/_search"
查看 id 是 1 的数据
curl -X GET "http://127.0.0.1:9200/tests/test/1"
只查看部分数据
curl -X GET "http://127.0.0.1:9200/tests/test/1?_source=a,b"
不显示 元数据
curl -X GET "http://127.0.0.1:9200/tets/test/1/_source"
检查文档是否存在
curl -X HEAD "http://localhost:9200/tests/test/1"
更新文档 文档不可改变 所以所谓的更新就行进行重新创建
curl -X PUT "http://localhost:9200/megacorp/employee/1" -H 'Content-Type: application/json' -d'
{
"first_name": "John",
"last_name": "Smith",
"age": 25,
"about": "I love to go rock climbing 萝卜青菜,各有所爱",
"interests": [
"sports",
"music"
]
}
'
创建文档
// 创建一个文档如果 _id 已经存在创建失败 201/409 op_type=create
// curl -X PUT "http://localhost:9200/megacorp/employee/4?op_type=create"
// 也可以完成相同的工作
curl -X PUT "http://localhost:9200/megacorp/employee/5/_create" -H 'Content-Type: application/json' -d'
{
"first_name": "John jj",
"last_name": "Smith kk",
"age": 90,
"about": "I love to go rock climbing 萝卜青菜,各有所爱",
"interests": [
"sports",
"music",
"sf"
]
}
'
Elasticsearch 学习笔记
路由一个文档到一个分片中
routing 通常是id
number_of_primary_shards 主分片的数目
主分片一般不可以扩展,不通过手段的话
一个自定义的路由参数可以用来确保所有相关的文档——例如所有属于同一个用户的文档——都被存储到同一个分片中
主分片和副本分片如何交互
每个节点都知道任意一个文档的位置,他可以将请求进行转发,
当发送请求的时候, 为了扩展负载,更好的做法是轮询集群中所有的节点。
? 我思考这里使用 nginx 进行负载均衡岂不是很好
新建、索引和删除文档
新建、索引和删除 是写操作必须在主分片上操作,然后复制到副本分片
具体过程是:
请求 -> 转发 —> 索引 -> 所有的副分片与主分片同步 -> 返回结果给转发的节点 -> 返回给客户端
取回单个文档
请求 -> 轮询转发 -> 查询 -> 返回结果给转发的节点 -> 返回给客户端
如果建立索引返回了 那么 主分片 和 副分片的数据是一致的。
局部更新文档
请求 -> 转发 —> 修改(如果有别的进程修改会在有限次数内重试)(重新建立索引) -> 所有的副分片与主分片同步 -> 返回结果给转发的节点 -> 返回给客户端
同步的时候用的是一个文档的全部,因为这个同步是异步的如果只同步修改可能会导致问题
多文档模式
mget
请求 —> 拆分 -> 转发 -> 处理 -> 搜集 -> 返回结果
bulk
请求 -> 拆分/组和 —> 转发 -> 修改 -> 同步 -> 搜集结果 -> 返回给客户端
bulk 对于格式要求严格 是性能上面的考虑
多索引, 多类型
/_search
在所有的索引中搜索所有的类型
/gb/_search
在 gb 索引中搜索所有的类型
/gb,us/_search
在 gb 和 us 索引中搜索所有的文档
/g*,u*/_search
在任何以 g 或者 u 开头的索引中搜索所有的类型
/gb/user/_search
在 gb 索引中搜索 user 类型
/gb,us/user,tweet/_search
在 gb 和 us 索引中搜索 user 和 tweet 类型
/_all/user,tweet/_search
在所有的索引中搜索 user 和 tweet 类型
映射和分析
_all 字段是 string
如果 Elasticsearch 猜测到 一个字段是 data 类型你用 str 的方式搜索会导致搜索不到结果。
精确值 VS 全文
精确值就像 sql 查询那样 是就是是,不是就是不是。
全文的话就是说获取到文档和查询的匹配度。
全文搜索我们更加希望获得更多相关的信息
倒排索引
所谓的倒排索引就是将所有的文档进行分词然后对每个词和所对应的文档建立索引。
类似与下面这个样子
如果对同义词和相同词根的词进行合并的话
如果我们对用户的搜索词也采用这种方法进行统一就可以快速的获得结果。
分词和标准化叫做分析
复杂核心域类型
多值域
类型必须相同, 自动确定类型为第一个, 保存没有顺序
空域
Lucene 中不能存储 null 值
都是就空域不会被索引
多层级对象
一个对象内可以有其他对象
内部对象映射
一个内部对象的 type 是 object。
其他都是一样
内部对象索引
可以通过 . 来引用比如:
索引建立不会有复杂的结构
内部对象数组
会丢失对象内部数据的关联性
使用 嵌套对象解决
会被解释为:
查询
查看所有的 index
查看一个 index 的信息
删除一个索引
查看 tests 索引下的 test 类型下的所有数据
查看 id 是 1 的数据
只查看部分数据
不显示 元数据
检查文档是否存在
更新文档 文档不可改变 所以所谓的更新就行进行重新创建
创建文档
删除文档
更新文档
使用脚本更新文档
通过脚本给数组添加数据
批量获得多个文档, 相应数据和请求数据顺序相同
在url中给出 _index 或者 _type, url中给定的可以被覆盖
_index 和 _type 相同 而且只请求 id 的话直接使用 ids, 如果指定的 _id 不存在的话 found=false
代价小的批量操作
空搜索
分页
建立一个 mapping
查看 mapping
打开一个索引
查看分词器的效果
新建一个索引,并且指定一个type中的一个域的分析器
获取一个 type 的 mapping
不可以直接修改一个type的 mapping
匹配所有文档
简单的组合查询
验证查询
聚合 提取其他数据
自定义评分
自定义评分指定计算
过滤非空排序
自定义字段的权重
使用 painless 脚本进行排序
The text was updated successfully, but these errors were encountered: