ES 总结:
es 是基于lucene的, 是java 实现的, 很多概念和lucene是相同的
索引—— 对应数据库的表,mongoDB中的集合
文档,由字段组成, 一个字段可以出现多次。
字段,其类型可以是任意的, 也可以是复合的, 注: 不同类型的同名字段不能设置为不同类型。
分片:每个分片是一个独立的lucene实例, 一个独立的jvm, 一个索引的数据可以有多个 分片组成———— 数据量大的时候, 通常都是这样的, 而且每个分片都是位于集群不同的节点上。
分片的大小是不能控制的, 但是分片数量是可以控制的副本:或者说副本分片, 他是对原始分片的精确拷贝, 原始分片称为主分片。 它是相对分片的一个概念。 通常,我们对索引的所有操作都是直接作用在主分片上, 然后, es 会将操作同步到副本上去。
主分片不可用了(如对应节点down 掉) 副本会被提升为 主分片。 主分片和其副本是位于不同 节点上的, 这个是必须的, 否则副本不会被分配下去。 因为同一个节点上同时分配主分片/副本是无意义的。 机制决定的。配置:
rack 表示机架 ip默认是localhost, 只能本机访问, 需要改为具体ip, 以便局域网内其他机器可用访问。 默认端口是 9200, 如果默认端口不可用, 则会自动绑定下一个端口..?put 和post 的区别, put 可用创建一个不存在的索引, 类型, 或者同时, post 操作时候, 可以创建索引, 但不能同时创建索引/类型, id 也需要指定。。
post 更新文档: 需要先从_source 获取数据, 移除旧文档,应用变更,作为一个新文档创建。 ?? 这么复杂/麻烦?
———— 如果没有启用 _source 字段, 怎么办?REST 通过请求头的动词操作, 但是有时候我们需要其他辅助:
_create 指明是创建操作
_update 指明是更新 _search 指明是 search API,_id 指明id 字段
_type:指明type 获取方式_all 一个复制了所有其他属性内容的 字段,默认开启, 用于:
_version _size _source字段原始的 _index 默认禁用 文档被索引到那个 索引文件的信息_boost
_timestamp 默认禁用,不会存储/索引 _ttl_shards
upsert
...
URL 的 参数:
pretty 适用于GET操作
routing映射:
设置字段的类型,存储方式:
如:
PUT /lfs_files { "mappings": { "my_file" : { "_id": { "path": "id" }, "dynamic": "strict", "date_detection": false "properties" : { "id" : { "type" : "long", "index": "not_analyzed" }, "userId" : { "type" : "long", "index": "not_analyzed" ... } } } }index_name, 可不写,默认为字段名。
index 可以为analyzed 或no , 默认analyzed
或对字符串类型字段 可以是 not_analyzed , 表示只会, 整个存储起来, 但是不会被分析(就是不会被空格处理/大小写/特殊字符过滤等等之类的), 只有完全匹配的搜索才能查到该字段store yes/no, 默认no, 指定是否存储字段原始值。。
boost 权重, 评分用的, 一般用于结果的排序, 过滤
null_value : 索引时候, 不存在时, 写入的默认值, 如果没有默认行为是忽略。
include_in_all , 是否被包含到 _all 字段中,
_source 字段: 它到底是什么东西?
字符串型:
特有属性:term_vector: —— 高亮时需要
omit_norms: index_options: analyzer: 泛指index_analyzer,search_analyzer, 默认是全局定义的分析器 index_analyzer: 用于索引时 search_analyzer:用于搜索时ignore_above: 字段的最大长度
数值型:string
precision_step: range 查询时候有用
ignore_malformed:日期:date
format: precision_step ignore_malformed布尔型: boolean
二进制: binary
只支持 index_name 属性multi_field:
fields : {} ...内置分析器:
自定义分析器:
{ settings:{ index: { analysis: { analyzer:{ 自定义分析器名称:{ tokenizer: xxx 如standard filter: [ lowercase, asciifolding, 自定义过滤器名 ] } } }, filter:{ 自定义过滤器名:{ type: kstemxxx } } } }mappings: 类型名: _analyzer: { path: xxx ———— 指明分析器名为 path 对应的字段的那个值, 用于动态设置。。 } _source: { enabled : false +++++ false 或者true, 表明是否存储文档源, ———— 具体表明了?? } _all: { enabled : false +++++ false 或者true, 表明是否在_all 字段包含所有文本字段的取值。。 false 表示禁用。 它会自动索引大小, 不需要的时候, 最好禁用。 } // 动态映射, 即不具体制定字段类型的时候, 只能靠es来猜了, 那么, 具体如何猜呢? 它会先参考 动态映射。 当然,如果没有动态映射, 那么就使用默认的机制猜测。 numeric_detection: true/ false dynamic_date_formats: [yyyy-MM-dd hh:mm ] 是一个数组 // dynamic: false 禁用自动生成映射, 同时禁止自动添加新字段。 默认 true dynamic_templates: [ template名: { match: "*" //unmatch: "" mapping: { type: multi_field, fields :{ {name}: { type: dynamic_type}, str: { type: string} } } } ] _routing: { xxx } properties: { xx } }}
}
//模板
{ template: "*" order: 1, settings: { index.number_of_replicas: 0 } mappings:{ default: { _source: { enabled: false } } } }动态模板:
xxx路由:
routing 参数 _routing 字段: _routing: { requered: true, path:userId }es 全部可用的过滤器类型列表:
官网。。。默认分析器: 索引时候, 未指明分析器,那么使用这个。
{ settings:{ index: { analysis: { analyzer:{ default:{ --- 使用 default 关键字即可 tokenizer: xxx 如standard filter: [ lowercase, asciifolding, 自定义过滤器名 ] } } }, filter:{ 自定义过滤器名:{ type: kstemxxx } } } } }别名:
_aliases 参数
搜索数据:
查询/索引的过程: 索引过程:搜索过程:
分析过程: 预备字段内容,将其转换为词项(term)的过程, 索引时, 内容 被拆分为 词条流。 —— 词项是带有输入位置等额外信息的词条。词条:单词
词条化:tokenizer ? 过滤: filter?分析器: 带有0或多个过滤器的分词器。
================================================================================================================================================
查询:
url 查询
DSL
分页
返回版本号
{ version: true ... }限制结果分数:
min_score指定返回字段:
fields : [ xxx, yyy], 如果没有指定,你们使用默认的 _source, * 表示所有存储的字段
partial_fields:
script_fields: 自定义字段名 script:xxx搜索类型:
query_and_fetch
。。 count scan&scroll dfs_xx指定搜索执行的位置:
_primary _local ..查询类型:
term 查询: terms 查询: match match_phrase match_phrase_prefix match_all multi_match query_string field 对query_string 的简化 ids prefix fuzzy wildcard mlt range查询重写:
rewrite过滤查询结果:
使用过滤器 先查询,再过滤
{ query xxx filter xxx }filtered 先过滤,再查询(效率更高)
{
query filtered query field —— 这个是什么查询类型 filter term —— term查询 }过滤器有哪些:
range
term exists missing script type 用于查询多个索引, 很多文档类型的时候, 用于过滤,限制文档类型 limit 限制每个分片的返回的文档数目 ids bool and or not过滤器的别名
过滤器的缓存:
复合查询:
bool 组合 boosting 组合 positive negative negative_boost constant_scoreindices 在多个索引上进行查询, 封装一个 索引的数值, 两个查询
indices indices [] query no_match_querycustom_fileters_score 封装一个查询, 若干过滤器
custom_boost_factor custom_score 通过脚本为另一个查询定制分值排序:
默认排序: score sort 指定确实字段的行为 动态标准 sort _script script2.8 使用脚本
script
lang 默认mvel params 脚本参数使用方法:
_script script 脚本内容或者 脚本文件名 lang 默认为 mvel params 参数脚本中可用的对象:
doc 也可以是 _doc doc['xxx'].value 方式访问 处理(分析)后的文档 _source _source.xxx.value 方式访问 原始字段值 _fields _fields.xxx.value 方式访问 ?结果分析:
took
timed_out hits { total max_score hits: [ _index _type _id _version _source : { xxx } ] }================================================================================================================================================
================================================================================================================================================ 插件
插件
JavaScript 语言插件
处理文件插件:
elasticsearch/elasticsearch-mapper-attachments
bigdesk
lukas-vlcek/bigdesk
head
mobz/elasticsearch-headparamedic
SPM
================================================================================================================================================ 非平面数据
非平面数据
对象 obj: {
type : object, properties : { attr1: { type : xxx xxx } ... } } 数组 arr: { properties : { element1: { type : xxx xxx } ...} }
================================================================================================================================================ 高亮:
高亮:
需要字段原始值: 字段要么 store = yes, 如果是no, 那么 _source 应该是可用的, 否则, 无法高亮。。。
实现:
1 标准实现 2 依赖于term向量es 会自动选择
html 标签:
{
highlight pre_tags: [ ] post_tags: [ ] fields requered_field_matchnumber_of_fragements fragment_size
}
================================================================================================================================================
自动补全
autocomplete
edgeNGram
统计/切面 faceting facet
================================================================================================================================================
================================================================================================================================================ 优化 分析: _analyze?analyzer=xxx 指定分析器进行分析, 没有analyzer 则使用默认的分析器 _analyze?tokenizer=xxx&filters=xx,yy解释查询
_explain 查询参数================================================================================================================================================
================================================================================================================================================ 同义词{
settings:{ index: { analysis: { analyzer:{ synonym分析器: { tokenizer filter: [ synonym名 ] } } }, filter:{ synonym名:{ type: synonym ignore_case: true synonyms: [ jump => leap ... ] } } }可见,synonym 就是一个分析器, 但是他的 过滤器的类型是 synonym
synonym_path 可以代替synonyms, 表示一个文件
使用 solr 的同义词
同义词等价定义
扩展
使用WordNet 同义词
================================================================================================================================================
================================================================================================================================================ span 查询span_term
span_first span_near span_not span_or================================================================================================================================================
================================================================================================================================================ 组合索引variation API
索引树性结构
url 参数:
parent child字段:
_parent _childhas_child
has_parent嵌套对象
================================================================================================================================================
================================================================================================================================================ rivermongodb 插件
================================================================================================================================================
================================================================================================================================================ 网关================================================================================================================================================
================================================================================================================================================ 批量操作 _bulk url 参数{
create: update: delete: index: ...}
UDP 批量操作:
批量取
_mget
批量查询
_msearch================================================================================================================================================
================================================================================================================================================ 统计/切面 统计/切面 是针对 一个或多个索引的, 多个类型? 一个类型? 反正一个文档, 肯定是不行的, 数据量太少, 怎么统计, 毫无意义啊query 统计
得到匹配查询的结果数目filter 统计
得到匹配查询的结果数目terms 统计
返回指定字段中使用最多的词项range 统计
返回某个范围的 结果数目它会继续 min max mean count total 等值
histogram 统计
对字段取值按间隔 统计, 建立直方图 , 只对 数字/ 日期型 字段中,间隔: 通过 interval 控制
date_histogram 统计
statistical 统计
min max mean 平方和 总和 方差 标准差 等等terms_stats 统计
综合了 terms/ statistical 统计geo_distance 统计
过来统计结果:
facet_filter
统计计算范围:
scope
nested
================================================================================================================================================
================================================================================================================================================ 相似文档 _mlt 查询参数min_doc_freq
min_term_freq ...================================================================================================================================================
================================================================================================================================================ 反查 percolator _percolator 查询参数感觉好奇怪,
对文档进行反查?
0 准备,假设存在一个 notifier 的索引,
其中存在类型: 数据:1 先向 名为_percolator 的索引中, 注册一个查询, 也就是往 _percolator 的索引存入一个文档。 这个是一个普通的put
put _percolator/notifier/id {
query: { xxx } --- 这个字段是必须的, 反查嘛。。 自定义的字段。。。 }2 用户对notifier 进行查询 等操作 —— 这个过程是用户端发生的
3 进行反查, 也就是对刚才的notifier的索引的 x/_percolator 部分。 这个是一个特殊的查询了
特殊的是, 需要一个x 查询参数 , why ??GET notifier/x/_percolator
{ doc:{ notifier 的一个文档内容 documentX } query: { 查询条件 Q } }这个意思是说,
用户进行了很多对notifier 的查询, 那么, 他们是否有人曾经查询过documentX呢, 以 Q 的方式, 换句话说, 是否有人以Q 方式使用特定的这 documentX 呢
================================================================================================================================================
================================================================================================================================================ 节点探索 discoveryzen directory
================================================================================================================================================
================================================================================================================================================ 管理集群_stats 查询参数 进行 统计
docs 统计信息
store 统计信息 indexing get search_cluster
主节点:
node.master
node.data
discovery.zen.minimum_master_nodes 最小集群节点数
================================================================================================================================================
================================================================================================================================================ 端点_validate/query 验证
_cluster
nodes state_status
_nodes索引分段
_segements
控制分片 副本
node.zone
移动分片 reroute
post _cluster/reroute
{
commands: { { move : { from to ..} allocate }}
}
================================================================================================================================================
================================================================================================================================================ url 参数================================================================================================================================================ 滚动
如何操作:
1 先建立scroll 查询, 获取 scroll_id字段: _scroll_id
url 查询参数 scroll_id
2 然后使用 scroll_id
3 ...
================================================================================================================================================ 特殊字段
================================================================================================================================================ 再平衡 rebalancing
================================================================================================================================================ 预热
_warmer
warm_facet