热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Elasticsearch技术详解与实战

基于lucene倒排索引关键词索引,查询处理语句(由Analyzer完成)怎么处理单词的分割(逗号,空格&#x
基于lucene倒排索引

关键词索引,查询

处理语句(由Analyzer完成)

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

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

 

关键词文章号[出现频率]出现位置
guangzhou1[2][3,6]
live1[2],2[1][1,2]  [2]
shanghai2[1][3]
tom1[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方法数据处理说明
POSTCreate新增一个没有id的资源
GETRead取得一个资源
PUTUpdate更新一个资源,或新增一个含id的资源
DELETEDelete删除一个资源

 

 

 索引

创建索引

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应用特定的元字段

转:https://www.cnblogs.com/xiaotao13725566749/p/9003028.html



推荐阅读
  • 部署solr建立nutch索引
    2019独角兽企业重金招聘Python工程师标准接着上篇nutch1.4的部署应用,我们来部署一下solr,solr是对lucene进行了封装的企 ... [详细]
  • 【Mysql】九、Mysql高级篇 索引
    MYSQL索引一、什么是索引?二、索引数据结构1、mysql数据库的四种索引2、BTREE结构三、索引分类、创建索引、查看索引1、单值索引2、复合索引3、函数索引4、 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
  • ps:写的第一个,不足之处,欢迎拍砖---只是想用自己的方法一步步去实现一些框架看似高大上的小功能(比如说模型中的toArraytoJsonsetAtt ... [详细]
  • camel_使用Camel在来自不同来源的Solr中索引数据
    camelApacheSolr是建立在Lucene之上的“流行的,快速的开源企业搜索平台”。为了进行搜索(并查找结果),通常需要从不同的源(例如内容管理 ... [详细]
  • 开发笔记:使用JavaScript解决网页图片拉伸问题
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了使用JavaScript解决网页图片拉伸问题相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
author-avatar
陈陈
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有