Elasticsearch 详细使用,有点多,只要详细看完,大致开发没什么问题了

安装并启动

下载官网gz包,并放到/usr/local/ 下

  • 修改conf下文件elasticsearch.yml
	cluster.name: 集群名称
	node.name: 节点名称
	http.port: 9200 
	path.data: /home/software/elasticsearch/data 数据存放地址
	path.logs: /home/software/elasticsearch/logs 日志文件
	cluster.initial_master_nodes: ["node-main"] 数据节点
	transport.tcp.port: 9300 
	network.host: 0.0.0.0
	http.cors.enabled: true
	http.cors.allow-origin: "*"跨域
	bootstrap.memory_lock: false
	bootstrap.system_call_filter: false
  • 修改jvm.options文件
	-Xms1g
	-Xmx1g
	根据内存大小修改
  • 启动系统必须添加额外用户
	useradd es
	chown -R es:es   es目录
  • 修改系统文件
	/etc/security/limits.conf 
	在最后一行添加
	* soft nofile 65536
	* hard nofile 65536
	* soft nproc  4096
	* hard nproc  4096
	/etc/sysctl.cof
	最后一行添加
	vm.max_map_count=655360
  • 重载配置
	sysctl  -p
  • 启动
	#切换用户
	su es
	在文件./bin/elasticsearch启动 加-d后台启动
  • 访问 ip:9200
	可通过elasticsearch-head连接
  • 注意事项:
	注意看配置文件,不要改错
	关闭防火墙或开启端口

操作

集群健康检查
	GET _cluster/health
	
	详细解释
	https://www.elastic.co/guide/cn/elasticsearch/guide/current/_cluster_health.html#_cluster_health
1、创建索引
	PUT /index_test
	{
		“settings”:{
			“index”:{
				“number_of_shards”:”2”,
				“number_of_replicas”:”0”
			}
		}
	}
  • 查看索引
	GET  _cat/indices?v
  • 删除索引
	DELETE  /index_test
2、创建索引的同时创建mappings
	PUT /index_str
	{
		“mappings”:{
			“properties”:{
				“realname”:{
					“type”:”text”,
					“index”:true
				},
				{
					“type”:”keyword”,
					“index”:false
				}
			}
		}
	}
  • 查看分词效果
	GET /index_mapping/_analyze
	{
		“field”:”realname”,
		“text”:”this is lg”
	}

	注意事项:7.0版本后使用post,并且url连接不要携带什么参数,否则会报错
  • 尝试修改
	POST /index_str/_mapping
	{
		“properties”:{
			“name”:{
				“type”:”long”
			}
		}
	}
  • 为已存在的索引创建或创建mappings
	POST  /index_str/_mapping
	{
		“properties”:{
			“id”:{
				“type”:”long”
			},
			“age”:{
				“type”:”integer”
			}
		}
	}
3、添加文档数据
	POST /my_doc/_doc/1   {索引名}/_doc/{索引id} 此id是es id
	{
		“id”:”1001”,
		“name”:”imooc-1”,
		“desc”:”imooc is very good”,
		“create_date”:”2019-12-24”
	}
4、删除与修改
  • 删除文档
	DELETE /my_doc/_doc/1
  • 局部
	POST /my_doc/_doc/1/_update
	{
		“doc”:{
			“name”:”慕课”
		}
	}
  • 全部替换
	PUT /my_doc/_doc/1
	{
		"name":"1212",
		全部内容
	}
  • 常规搜索
	GET /my_doc/_doc/_search
	GET /my_doc/_doc/1
  • 元数据
	_index:文档数据所属哪个索引,理解为数据库的某张表
	_type:文档数据属于哪个类型,新版本使用_doc
	_id:文档数据唯一标识,类似数据库中某张表主键,可以自动生成或者手动生成
	_score:查询相关度,是否匹配用户,分数越高用户的搜索体验越高
	_version:版本号
	_source:文档数据,json数据
  • 定制结果集
	GET /index_demo/_doc/1?_source=id,name
	GET /index_demo/_doc/_search?_source=id,name
  • 判断文档是否存在
	HEAD  /index_demo/_doc/1
5、文档乐观锁控制if_seq_no与if_primary_term
  • 插入新数据
	POST  /my_doc/_doc
	{
		数据
	}
	
	#此时_version 为1
  • 修改数据
	POST /my_doc/_doc/{_id}/_update
	{
		“doc”:{
			“name”:”慕课”
		}
	}
	#此时 _version 为 2
  • 模拟两个客户端操作同一个文档数据,_version都携带为一样的数值
	#操作
	POST  /my_doc/_doc/{_id}/_update?if_seq_no={数值}&if_primary_term={数值}
	{
		“doc”:{
			“name”:”慕课1”
		}
	}
	#操作2
	POST /my_doc/_doc/{_id}/_update?if_seq_no={数值}&if_promary_term={数值}
	{
		“doc”:{
			“name”:”慕课2”
		}
	}
  • 版本元数据
	_seq_no:文档版本号,作用同_version(相对于学生编号,每个班级的班主任为学生分配编号,效率要比学校教务处分配来的更加高来更方便)
	_primary_term:文档所在位置(相对于班级)
6、分词与内置分词器
  • 什么是分词?
	把文本转换为一个个的单词,分词称之为analysis。Es默认只对英文语句做分词,中文不支持,每个中文都会被拆分为独立的个体。
	POST /_analyze
	{
		“analyzer”:”standard”,
		“text”:”text文本”
	}
	POST /my_doc/_analyze
	{
		“analyzer”:”standard”,
		“field”:”name”,
		“text”:”text文本”
	}
  • Es内置分词器
	Standard:默认分词,单词会被拆分,大小会转换为小写
	Simple:按照非字母分词,大写转为小写
	Whitespace:按照空格。忽略大小写
	Stop:去除无意义单词,比如the/a/an/is
	Keyword:不做分词,把整个文本作为一个单独的关键词
	{
		“analyzer”:”standard”,
		“text”:”My name is peter parker,I am a Super Hero. I don’t like the Criminals.”
	}
建立IK中文分词器
  • 下载IK中文分词器
	Github:https://github.com/medcl/elasticsearch-analysis-ik
	Zip解压:unzip xxx.zip -d ik
	Ik放在 your-es-root/plugins/下
  • 测试中文分词效果
	POST /_analyzer
	{
		“analyzer”:”ik_max_word”,
		“text”:”上下班车流量很大”
	}
自定义中文词库
  • 1、在{es}/plugins/ik/config 下,创建
	Vim custom.dic
  • 2、并且添加内容
	慕课网
	骚年
  • 3、配置自定义扩展词典
	<entry key=”ext_dict”>custom.dic</entry>
  • 4、重启

DSL搜索-入门语法

请求参数的查询(QueryString)
	GET /shop/_doc/_search?q=desc:慕课网
	GET /shop/_doc/_search?q=nickname:幕&q=age:25
	Text与keyword搜索对比测试(keyword不会被倒排索引,不会被分词)
	GET /shop/_doc/_search?q=nickname:super
	GET /shop/_doc/_search?q=username:super
	GET /shop/_doc/_search?q=username:super hero
	这种方式称之为querystring查询方式,参数都是放在url中作为请求参数的
DSL基本语法
	Querystring 用的很少,一旦参数复杂就难以构建,所以大多查询都会使用dsl来进行查询更好
	Domain Specific Language
	特定领域语言
	基于JSON格式的数据查询
	查询更灵活,有利于复杂查询
  • DSL格式语法:
	#查询
	POST  /shop/_doc/_search
	{
		“query”:{
			“match”:{
				“desc”:”慕课网”
			}
		}
	}
	#判断某个字段是否存在
	{
		“query”:{
			“exists”:{
				“field”:”desc”
			}
		}
	}
	语法格式为一个json object,内容都是key-value键值对,json可以嵌套
	Key可以是一些es的关键字,也可以是某个field字段,后面会遇到
	搜索不合法问题定位
	DSL查询的时候经常会出现一些错误查询,出现这样的问题大多都是json无法被es解析,他会像java那样报一个异常信息,根据异常信息,根据异常信息去推断问题所在,关键词不存在未注册等等,甚至有时候不能定位问题直接复制错误信息到百度一下就可以了
  • DSL搜索-查询所有与分页
	Match_all
	在索引中查询所有的文档
	GET /shop/_doc/_search
	或	
	POST /shop/_doc/_search
	{
		“query”:{
		“match_all”:{}
	},
		“_source”:[“id”,”nickname”,”age”]
	}
	分页查询
	默认查询是只有10条记录,可以通过分页来展示
	POST /shop/_doc/_search
	{
		“query”:{
		“match_all”:{}
	}
		“form”:0,
		“size”:10
	}
	
	{
		“query”:{
		“match_all”:{}
	},
		“_source”:[
			“id”,
			“nickname”,
			“age”
		],
		“from”:5,
		“size”:5
	}
  • DSL搜索-term/match
	term精准的时候会把用户搜索内容,比如“慕课网强大”作为一整个关键词搜索,而不会对其他进行分词后再搜索
	POST /shop/_doc/_search
	{
		“query”:{
			“term”:{
				“desc”:”默课网”
			}
		}
	}
	对比
	{
		“query”:{
			“match”:{
				“desc”:”慕课网”
			}
		}
	}
	注:match会对“慕课网”先进行分词(其实就是全文检索),在查询,而term则不会,直接把“慕课网”作为一个整的词汇去搜索
	Head 可视化操作对比查看
  • Terms多个词语匹配检索
	相对于是tag标签查询,比如慕课网的一些课程会打上前端、后端、大数据、就业课这些标签,可以完全匹配做类似标签的查询
	POST /shop/_doc/_search
	{
		“query”:{
			“terms”:{
				“desc”:[“慕课网”,”学习”,”骚年”]
			}
		}
	}
  • DSL搜索-match_phrase
	Match_phrase短语匹配
	Match:分词后只要有匹配就返回,match_phrase:分词结果必须在text字段分词中都包含,而且顺序必须相同,而且必须都是连续的。(搜索比较严格)
	Slop:允许词语间跳过的数量
	POST /shop/_doc/_search
	{
		“query”:{
			“match_phrase”:{
				“desc”:{
					“query”:”大学 毕业 研究生”,
					“slop”:2
				}
			}
		}
	}
  • DSL搜索-match(operator)/ids
	match扩展
	Operator
	Or:搜索内容分词后,只要存在一个词语匹配就展示结果
	And:搜索内容分词后,都要满足词语匹配
	POST /shop/_doc/_search
	{
		“query”:{
			“match”:{
				“desc”:”慕课网”
			}
		}
	}
	#等同于
	{
		“query”:{
			“match”:{
				“desc”:{
					“query”:”xbox游戏机”,
					“operator”:”or”
				}
			}
		}
	}
	#相对于 sql and or
	Minimum_should_match:最低匹配精度,至少有【分词后的词语个数】x百分百,得出一个数据值取整。举个例子:当前属性设置为70,若一个用户查询检索,有10个词语,那么匹配度按照10X70%=7,则desc中至少需要有7个词语匹配,就展示;若分词后有8个,则8X70%=5.6,则desc中至少需要有5个词语展示
	Minimum_should_match 也能设置具体的数字,表示个数
	POST /shop/_desc/_search
	{
		“match”:{
			“desc”:{
				“query”:”女友生日”,
				“mimimum_should_match”:”60%”
			}
		}
	}
  • 根据文档主键ids搜索
	GET /shop/_doc/1001
  • 查询多个
	POST /shop/_doc/_search
	{
		“query”:{
			“ids”:{
				“type”:”_doc”,
				“values”:[“1”,”2”]
			}
		}
	}
  • DSL搜索-multi_match/boost
	Multi_match
	满足使用match在多个字段中进行查询的需求
	POST /shop/_doc/_search
	{
		“query”:{
			“multi_match”:{
				“query”:”按说西安西安市”,
				“fields”:[“desc”,”name”]
			}
		}
	}
	Boost
	权重,为某个字段设置权重,权重越高,文档相关性得分就越高。通畅来说搜索商品名称要比商品简历的权重更高。
	POST /shop/_doc/_search
	{
		“query”:{
			“multi_match”:{
				“query”:”a下线啊”,
				“fields”:[“desc”,”name^10”]
			}
		}
	}
  • DSL搜索-布尔查询
	可以组合多重查询
	Must:查询必须匹配搜索条件,譬如and
	Should:查询匹配满足1个以上条件,譬如or
	Must_not:不匹配搜索条件,一个都不要满足
	实操1:
	POST /shop/_doc/_search
	{
		“query”:{
			“bool”:{
				“must”:[
					{
						“multi_match”:{
							“query”:”慕课网”,
							“fields”:[“desc”,”name”]
						}
					},
					{
						“term”:{
							“sex”:1
						}
					},
					{
						“term”:{
							“birthday”:”1996-01-14”
						}
					}
				]
			}
		}
	}
	
	{
		“query”:{
			“bool”:{
				“should(must_match)”:[
					{
						“multi_match”:{
							“query”:”学习”,
							“fields”:[“desc”,”name”]
						}
					},
					{
						“match”:{
						“desc”:”游戏”
						}
					},
					{
						“term”:{
						“sex”:0
						}
					}
				]
			}
		}
	}
  • DSL搜索-过滤器
	对搜索出来的结果进行数据过滤。不会到es库里去搜,不会去计算文档的相关分数,所以过滤的性能会比价高,过滤器可以和全文搜索结合在一起用。
	post_filter元素是一个顶层元素,只会对搜索结果进行过滤。不会计算数据的匹配度相关性分数,不会根据分数去排序,query则相反,会计算分数,也会按照分数计算
	使用场景:
	Query:根据用户搜索条件检索匹配记录
	Post_filter:用于查询后,对结果数据的筛选
	实操:查询账户金额大于80,元,小于160元。并且生日在1988-07-14
	Gte:大于等于
	Lte:小于等于
	Gt:大于
	Lt:小于
	(除此以外还能做其他的match等操作也行)
	POST /shop/_doc/_search
	{
		“query”:{
			“match”:{
				“desc”:”熟悉爱看下”
			}
		},
		{
			“post_filter”:{
				“range”:{
					“money”:{
						“gt”:60,
						“lt”:1000
					}
				}
			}
		}
	}
  • DSL搜索-排序
	Es的排序同sql,可以desc也可以asc。也支持组合排序
	实操:
	POST /shop/_doc/_search
	{
		“query”:{
			“macth”:{
				“desc”:”查询书”
			}
		},
		“post_filter”:{
			“range”:{
				“money”:{
					“gt”:55.8,
					“lte”:155.8
				}
			}
		},
		“sort”:[
			{
				“age”:”desc”
			},
			{
				“money”:”desc”
			}
		]
	}
	对文本排序
	由于文本会被分词,所以往往要去做排序会报错,,通畅我们可以为这个字段增加额外的一个附属属性,类型为keyword,用于做排序
	创建新的索引
	POST /shop/_mapping
	{
		“propertis”:{
			“id”:{
				“type”:”long”
			},
			“nickname”:{
				“type”:”text”,
				“analyzer”:”ik_max_word”,
				“fields”:{
					“keyword”:{
						“type”:”keyword”
					}
				}
			}
		}
	}
  • DSL搜索-高亮highlight
	高亮显示
	POST /shop/_doc/_search
	{
		“query”:{
			“match”:{
				“desc”:”马赛克”
			}
	},
	“highlight”:{
		“pre_tags”:[“<tag>”],
			“post_tags”:[“</tag>”],
			“fields”:{
				“desc”:{}
			}
		}
	}
	课外拓展-prefix-fuzzy-wildcard
	Prefix
	根据前缀去查询
	POST /shop/_doc/_search
	{
		“query”:{
			“prefix”:{
				“desc”:”imo”
			}
		}
	}
	Fuzzy
	模糊搜索,并不是指的sql的模糊搜索,而是用户在进行搜索的时候的打字错误现象,搜索引擎会自动纠正,然后尝试匹配索引库中的数据
	POST /shop/_doc/_search
	{
		“query”:{
			“fuzzy”:{
				“desc”:”imoov.coom”
			}
		}
	}
	#或多字段搜索
	{
		“query”:{
			“multi_match”:{
				“fields”:[“desc”,”name”],
				“query”:”imcoo supor”,
				“fuzziness”:”AUTO”
			}
		}
	}
	
	{
		“query”:{
			“multi_match”:{
				“fields”:[“desc”,”name”],
				“query”:”打打”,
				“fuzziness”:”1”
			}
		}
	}
	Wildcard
	占位符查询
	?:1个字符
	* :1个或多个字符
深度分页
  • 分页查询
	POST /shop/_doc/_search
	{
		“query”:{
			“match_all”:{}
		},
		“from”:0,
		“size”:10
	}
  • 深度分页
	深度分页其实就是搜索的深浅度,比如第1页,第2页,第3页是比较浅的;第10000页,第20000页就是深了
	使用如下操作
	{
		“query”:{
			“match”:{}
		},
		“from”:9990,
		“size”:10
	}
	
	{
		“query”:{
			“match_all”:{}
		},
		“from”:9999,
		“size”:10
	}
	我们在获取第9999条到10009条数据的时候,其实每个分片都会拿到10009条数据,然后集合在一起,总共是10009*3=300024条数据,针对30027数据再次排序,会获取最后10条数据。
	如此一来,搜索的太深,就会造成性能问题,会耗费内存和占用cpu。而且es为了性能,他不支持超过一万条数据以上的分页查询。那么如何解决深度分页带来实现,我们应该限制深度分页,比如最多提供100页,之后就没有了,如淘宝
  • 深度分页-提升搜索量
	提升搜索量
	通过设置index.max)result_window来突破10000数据
	GET /shop/_settings
	PUT /shop/_settings
	{
		“index.max_result_window”:”20000”
	}
  • scroll滚动搜索
	一次性查询1万+数据,往往会造成性能影响,因为数据量太多了。这个时候可以使用滚动搜索,也就是scroll。
	滚动搜索可以先查询出一些数据,然后在紧接依次往下查,在第一次查询的时候会有一个滚动id,相对于一个锚标记,随后再次滚动搜索会需要上一次搜索,根据这个进行下一次的搜索请求。每次搜索都是基于一个历史的数据快照,查询数据的期间,如果有数据变更,那么和搜索是没有关系的,搜索的内容还是快的
	Scroll=1m 相对session会话时间,上下文保持一分钟
	POST /shop/_search?scroll=1m
	{
		“query”:{
		“match_all”:{}
		},
		“sort”:[“_doc”],
		“size”:5
	}
	POST /_search/scroll
	{
		“scroll”:”1m”,
		“scroll_id”:”you last scroll_id”
	}
  • 批量操作bulk
	基本语法
	Bulk操作和以往的普通请求格式有区别。不要格式化json,然后就不在同一行了,这个需要注意
	{action:{metadata}}\n
	{request body}\n
	...
	{action:{metadata}}代表批量操作类型,可以是新增、删除或修改
	\n 换行,es的解析 ,postman直接回车,代码测试\n
	{request body} 是请求body,增加和修改操作需要,删除不需要
	批量操作的类型
	Action必须选择一下之一:
	Create : 如果文档不存在,那么就创建它。存在会报错。发生异常报错不会影响其他操作
	Index:创建一个新文档或者替换一个现有的文档
	Update:部分更新一个文档
	Delete:删除一个文档
	Metadata 中需要指定要操作的文档的_index/_type/_id/,也可以在url指定
  • 实操
	Create新增文档数据,在metadata中指定index以及type
	POST /_bulk
	{“create”:{“_index”:”shop2”,”_type”:”_doc”,”_id”:”2001”}}
	{“id”:”2001”,”name”:”name001”}
	...
	Create 创建已有id文档,在url中指定index和type
	POST /shop/_doc/_bulk
	{“create”:{“_id”:”2003”}}
	{“id”:”2003”,”name”:”name003”}
	...
	index创建,已有文档id会被覆盖,不存在的id则新增
	POST /shop/_doc/_bulk
	{“index”:{“_id”:”2001”}}
	{“id”:”2004”,”name”:”index2004”}
	...
	注意事项:注意换行,如果报错,检查换行就可以了

虽然很多,练习起来也很辛苦,但想想在使用es后,数据查询很快,是不是会很开心啊!
下来就愉快的玩耍吧!~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值