基于lucene倒排索引

关键词索引,查询

处理语句(由Analyzer完成)

  1. 怎么处理单词的分割(逗号,空格,特殊字符)
  2. 过滤不必要的单词
  3. 统一大小写
  4. 一些单词的复数,进行时,过去时,统一处理
  5. .过滤标点符号

建立倒排索引(统计单词出现的评率,及所在的文章)

 

关键词 文章号[出现频率] 出现位置
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 应用特定的元字段
posted on 2018-05-07 15:36  13725566749  阅读(167)  评论(0编辑  收藏  举报