基于lucene倒排索引
关键词索引,查询
处理语句(由Analyzer完成)
- 怎么处理单词的分割(逗号,空格,特殊字符)
- 过滤不必要的单词
- 统一大小写
- 一些单词的复数,进行时,过去时,统一处理
- .过滤标点符号
建立倒排索引(统计单词出现的评率,及所在的文章)
关键词 | 文章号[出现频率] | 出现位置 |
guangzhou | 1[2] | [3,6] |
live | 1[2],2[1] | [1,2] [2] |
shanghai | 2[1] | [3] |
tom | 1[1] | [2] |
live 文章1出现了2次,文章2出现了1次
术语及概念
索引词(term) 能进行精确搜索
文本(text) 文本是一段普通的非结构化文字,文本会被分析成一个个索引词。当搜索时可以根据关键词进行查询,搜索出原文本
分析(analysis) 分析是将文本转换为索引词的过程,分析结构依赖于分词器
集群(cluster) 集群是由一个或多个节点组成,对外提供服务。
节点(node) 是一个逻辑上独立的服务,是集群中的一部分
路由(routing) 当存储一个文档的时候,它会存在唯一的主分片,具体哪个分片是通过散列值进行选择的。默认情况下由文档ID生成
分片(shard) 是单个Lucene实例,索引是指向主分片和副分片的逻辑空间
主分片(primary sahrd) 默认情况下一个索引有5个分片,分片一旦建立,则分片的数量不能修改
副本分片(replica shard) 每一个分片有零个或多个副本
复制(replica) 避免单点问题,提高可用性
索引(index) 具有相同结构文档的集合(数据库)
类型(type) 一个索引下可以定义一个或多个类型(表)
文档(document) 存储在elasticsearch中的json格式字符串
映射(mapping) 定义了索引中每一个字段的类型
字段(field) 文档中包含零个或多个字段
来源字段(source field) 默认情况下原文档将会被存储在_source这个字段中,当你查询的时候也是返回这个字段
主键(ID) 文件的唯一标识,如果没有系统会自动生成一个
参数约定
通用参数
pretty ?prettty 让返回的参数容易看(格式化json数据)
human ?human 统计数据
日期表达式 gt(大于) lt(小于)
+1h 增加一小时
-1h 减少一个小时
/h 上一个小时
y(年) M(月) w(周) d(日) h(小时) m(分钟) s(秒)
now+1h 当前时间加一个小时
now+1h+1m 当前时间加一个小时1分钟
now+1h/d 当前时间加一个小时,四舍五入到最近一天
相应过滤 通过filter_path来减少返回值的内容,多个值可以用逗号隔开(返回的是指定的内容)
curl -XGET ‘127.0.0.1:9200/search?pretty&filter_path=took,hits.hists._id,hits._score’
Rest介绍
Rest请求头
Http方法 | 数据处理 | 说明 |
POST | Create | 新增一个没有id的资源 |
GET | Read | 取得一个资源 |
PUT | Update | 更新一个资源,或新增一个含id的资源 |
DELETE | Delete | 删除一个资源 |
索引
创建索引
PUT http://localhost:9200/website/
{ "settings":{ "index":{ "number_of_shards":3, "number_of_replicas":2 } } }
获取索引信息
GET http://localhost:9200/secisland/
打开/关闭索引
打开/关闭索引接口允许关闭一个打开的索引或者打开一个关闭的索引。关闭的索引只能显示索引的元数据信息。不能进行读写操作
POST http://localhost:9200/secisland/_close 或者_open
增加映射
https://segmentfault.com/a/1190000008897731(注意6.0和之前版本的类型不同的问题)
https://blog.csdn.net/jianblog/article/details/54928286 (对一个field设置多种索引方式)
https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html (6.x之后不支持多个mapping)
put http://tencent7:9200/secisland/
{ "mappings":{ "log":{ "properties":{ "message":{ "type":"string" } } } } }
向secisland添加文档类型为log,包含字段message
6.x
{ "mappings":{ "log":{ "properties":{ "message":{ "type":"text", "analyzer": "standard" } } } } }
也可以这样
put http://tencent7:9200/secisland/_mapping/log/
{ "properties":{ "message":{ "type":"text", "analyzer": "standard" } } }
设置索引的多个type(如果要在type下面添加一个或多个属性使用上面的方法)
http://tencent7:9200/secisland/
{ "mappings":{ "user":{ "properties":{ "name":{ "first":{ "type":"string" } }, "user_id":{ "type":"string", "index":"not_analyzed" } } } } }
6.x
{ "mappings":{ "user":{ "properties":{ "user_id":{ "type":"text", "index": true }, "name":{ "properties":{ "lastname":{ "type":"text", "index": true } } } } } } }
获取映射
GET http://localhost:9200/{index}/_mapping/{index} {index}可以接受逗号分隔符也可以使用_all来表示全部索引
GET http://localhost:9200/secisland/_mapping/user 获取指定类型的映射
GET http://localhost:9200/_all/_mapping/user,skill
索引别名(类似数据库的视图,用法也和直接查询索引一样)
elasticsearch可以对一个或者多个索引指定别名,通过别名可以查询到一个或者多个索引的内容。elasticsearch会自动把别名映射到相应的索引上。在系统中别名不能重复,也不能喝索引名重复。
https://www.cnblogs.com/rainwang/p/6062650.html(介绍索引用法)
增加别名
http://tencent7:9200/_aliases
{ "actions":[{"add":{"index":"secisland","aliases":"aliases1"}}] }
删除别名
http://tencent7:9200/_aliases
{ "actions":[{"remove":{"index":"secisland","aliases":"aliases1"}}] }
没有修改别名的语法,只有先删除后增加
一个别名关联多个索引
post http://tencent7:9200/_aliases
{ "actions":[{"add":{"indices":["secisland","secisland2"],"aliases":"aliases1"}}] }
过滤索引别名(只能看到被指定的)
post http://tencent7:9200/_aliases
{ "actions":[ { "add":{ "index":"test1", "alias":"alias2", "filter":{ "term":{ "user":"kimchy" } } } } ] }
路由
https://blog.csdn.net/u010454030/article/details/73554652 介绍路由的文章
别名也可以和路由相关联,一起使用
post http://tencent7:9200/_aliases
{ "actions":[ { "add":{ "index":"test2", "alias":"alias3", "filter":{ "term":{ "user":"kimchy" } }, "routing":"1" } } ] }
删除别名
DELETE http://{host}:{port}/{index}/_alias/{name}
查询现有的别名
GET http://{host}:{port}/{index}/_alias/*
更新索引配置
put http://tencent5:9200/test1/_settings
{ "index":{ "number_of_replicas":2 } }
更新分词器(需要先关闭索引)
post http://tencent5:9200/test1/_close
post http://tencent5:9200/test1/_close
put http://tencent5:9200/test1/_settings
{ "analysis":{ "analyzer":{ "content":{ "type":"custom", "tokenizer":"whitespace" } } } }
post http://tencent5:9200/test1/_open
获取索引配置
get http://tencent5:9200/test1/_settings
http://tencent5:9200/test1/_settings
自定义分析器
测试分析器
post http://tencent5:9200/_analyze
{ "analyzer":"standard", "text":"this is a test" }
使用标准的分词器解析文档 "this is a test"
重建索引
https://www.jianshu.com/p/a46fc9fce199
http://donlianli.iteye.com/blog/1924721
索引分片
提供lucene索引所在的分片信息,可以用来提供分片和索引的更多统计信息
get http://tencent5:9200/xiaotao/_segments
"_1" : { "generation" : 1, "num_docs" : 1, "deleted_docs" : 0, "size_in_bytes" : 4474, "memory_in_bytes" : 2212, "committed" : true, "search" : true, "version" : "7.2.1", "compound" : true, "attributes" : { "Lucene50StoredFieldsFormat.mode" : "BEST_SPEED" }
_1 JSON文档的键名,代表分片的名称。这个名用来生成文档名,分片目录中所有以分片名开头的文档属于这个分片
generation 需要写新的分片时生成的一个数字,基本上是递增的。分片名从这个生成的数字派生出来
num_docs 存储在分片中没被删除的文档数量
delete_docs 存储在分片中被删除的文档数量。
size_in_bytes 用来表示使用的磁盘空间数量
memory_in_byte 分片需要一些数据存储在内存中使搜索更高效
commit 表示分片在磁盘上是否同步
search 分片是否可进行搜索
version 用来写这个分片lucene版本
compound 分片是否存储在符合文件中
状态管理
清除缓存
post http://tencent5:9200/xiaotao/_cache/clear
索引刷新
post http://tencent5:9200/xiaotao/_refresh
索引冲洗
索引主要通过执行冲洗将数据保存到索引存储并且清除内部事务日志,以此来释放索引空间的内存空间
post http://tencent5:9200/xiaotao/_flush
文档管理
映射
概念
元字段: _index字段 _type字段 _id字段 _source字段
字段或属性:每个映射类型包含与类型相关的字段或属性列表。同一索引中不同映射类型的相同名称字段必须拥有相同的映射
数据类型
https://blog.csdn.net/chengyuqiang/article/details/79048800
字符串类型
string 从es5.x之后就不在支持string,由text和keyword替代
text 当一个字段要被全文搜索,设置为text会更加容易被分析
keyword keyword适用于结构化的字段,keyword只能通过精确值搜索到
整数类型
byte -128~127
short -32768~32767
integer -2^31~2^31-1
long -2^63~2^63-1
浮点类型
double 64位双精度
float 32位单精度
half_float 16位半精度
scaled_float 缩放类型的浮点数
data类型
日期表现格式 "2018-01-13"
long类型的毫秒数
integer的秒数
ip类型
ip类型用于存储IPV4或者IPV6地址
地理点数据类型
geo_point
动态映射
字段和映射的类型可以在使用前不需要事先定义。依靠动态映射,通过索引文档,新的映射类型和字段名会自动添加
更新映射
除了记录之外,现有的映射类型和字段不能更新。修改映射意味着废弃已经索引的文档,应该根据映射创建新的索引并且重新索引数据
常见的元字段
https://blog.csdn.net/napoay/article/details/62233031 (常见属性的详解)
标识元字段
参数 | 说明 |
_index | 文档所属的索引 |
_uid | 包含_type和_id的混合字段 |
_type | 文档的映射字段 |
_id | 文档的ID |
文档来源元字段
参数 | 说明 |
_source | 作为文档内容的原始JSON |
_size | _source元字段占用的字节数 |
索引元字段
参数 | 说明 |
_all | 索引所有字段值 |
_field_names | 文档中所有包含非空值的字段 |
_timestamp | 关联文章的时间戳 |
_ttl | 文档被自动删除之前的存活时间 |
_all字段是一个特殊包含全部内容的字段,在一个大字符串中关联所有其他字段的值,使用空格作为分隔符,可以被分析和索引但不会被存储,使用_all字段可以对文档的值进行搜索而不要知道包含所需值的字段名
post http://tencent5:9200/milk/employee 先插入一段数据
{ "firstname":"Jhone", "lastname":"Smith", "data_of_birth":"1970-10-23" }
利用_all字段进行搜索
get http://tencent5:9200/milk/_search
{
"query":{"match":{"_all":"john smith 1970"}}
}
但6.x不支持 _all
Enabling [_all] is disabled in 6.0. As a replacement, you can use [copy_to] on mapping fields to create your own catch all field.
路由元字段
参数 | 说明 |
_parent | 用于在映射类型之间创建父子关系 |
_routing | 一个自定义的路由值,路由文档到一个特定的分片 |
_parent字段 6.x已经被移除
其他元字段
参数 | 说明 |
_meta | 应用特定的元字段 |