_index,_type,_id
)大写
,大括号在请求下一行)4种REST请求方式即完成增删改查,当然在ES中改其实是先把旧的移除,重新创建一个新的文档,PUT也可以更新,但是是整体更新,POST则是可以内容追加,不过也是一个新的文档。Mapping
)Analysis
)Query DSL
)ES的基本类型有:(和关系型SQL区别不需要设置字段的长度)
字符串:text,keyword
数字类型:integer,long
浮点类型"float,double,
布尔类型:boolean,
时间类型:date
在ES中默认只有text类型可以分词,分词使用英文引擎,按照单词分词,如果是中文进行查询的话,则是将数据变成单字分词
查:
GET /索引名(即数据库)/_doc/_id(记录id值)
增(覆盖式)
PUT /索引名(即数据库)/_doc/_id(记录id值)
{
_id:''
}
改:(增量式)
POST /索引名(即数据库)/_doc/_id(记录id值)
{
要修改的字段
}
删除
DELETE /索引名(即数据库)/_doc/_id(记录id值)
批量操作
POST /索引名(即数据库)/_doc/_bulk
{
批量的文档(需注意每行文档记录不能换行)
}
高级查询:(Query DSL
)
1.查询所有
GET /索引名(即数据库)/_search
{
"query":{
"match_all":{}
}
}
2.term条件查询
GET /索引名(即数据库)/_search
{
"query":{
"term":{}
}
}
3.range范围查询
GET /索引名(即数据库)/_search
{
"query":{
"range":{
"字段":{
"gt":"值",
"lte":"值"
}
}
}
}
3.前缀查询
GET /索引名(即数据库)/_search
{
"query":{
"prefix":{
"字段":"值"
}
}
}
4.通配符查询
*是通配(可以匹配多个长度的),?是占位(匹配固定长度,如goo?,可匹配good,但不能god,匹配的字符长度是固定的)
GET /索引名/_search
{
"query": {
"wildcard": {
"字段": {
"value": "值* "
}
}
}
}
5.ids查询
GET /索引名/_search
{
"query": {
"ids": {
"values": id数组
}
}
}
6.模糊查询[fuzzy]
GET /products/_search
{
"query": {
"fuzzy": {
"字段":"值"
}
}
}
模糊查询[fuzzy],切记使用有以下规则
fuzzy 关键字: ⽤来模糊查询含有指定关键字的⽂档
注意: fuzzy 模糊查询 最⼤模糊错误 必须在0-2之间
搜索关键词⻓度为 2 不允许存在模糊
搜索关键词⻓度为3-5 允许⼀次模糊
搜索关键词⻓度⼤于5 允许最⼤2模糊
7.布尔查询
这个其实就是基本类似于关系性SQL中的:exist,not exist 等语法
bool 关键字: ⽤来组合多个条件实现复杂查询
must: 相当于&& 同时成⽴
should: 相当于|| 成⽴⼀个就⾏
must_not: 相当于! 不能满⾜任何⼀个
GET /索引名/_search
{
"query": {
"bool": {
"must": [
{
"term":
{
要求的条件JSON
}
}
]
}
}
}
8.多字段查询[multi_match]
GET /索引名/_search
{
"query": {
"multi_match": {
"query": "值",
"fields":字段数组
}
}
}
注意: 字段类型分词,将查询条件分词之后进⾏查询改字段 如果该字段不分词就会
将查询条件作为整体进⾏查询
9.默认字段分词查询[query_string]
GET /索引名/_search
{
"query": {
"query_string": {
"default_field": "查询字段",
"query": "值"
}
}
}
注意: 查询字段分词就将查询条件分词查询,查询字段不分词将查询条件不分词查询
10.⾼亮查询[highlight]
highlight 关键字: 可以让符合条件的⽂档中的关键词⾼亮
GET /索引名/_search
{
"query": {
"term": {
"字段": {
"value": "值"
}
}
},
"highlight": {
"fields": {
"*":{}
}
}
}
⾃定义⾼亮html标签: 可以在highlight中使⽤ pre_tags 和 post_tags
GET /索引名/_search
{
"query": {
"term": {
"字段": {
"value": "值"
}
}
},
"highlight": {
"post_tags": [""],
"pre_tags": [""],
"fields": {
"*":{}
}
}
}
多字段⾼亮 使⽤ require_field_match 开启多个字段⾼亮
GET /索引名/_search
{
"query": {
"term": {
"字段": {
"value": "值"
}
}
},
"highlight": {
"require_field_match": "false",
"post_tags": [""],
"pre_tags": [""],
"fields": {
"*":{}
}
}
}
11.分页查询
利用from,和size,起始页同样是0开始,0即第一页
返回指定条数[size]
size 关键字: 指定查询结果中返回指定条数。 默认返回值10条
分⻚查询[form]
from 关键字: ⽤来指定起始返回位置,和size关键字连⽤可实现分⻚效
果
GET /索引/_search
{
"query": {
"match_all": {}
},
"size": 5,
"from": 0
}
指定字段排序[sort]
GET /索引名/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"字段": {
"order": "desc"
}
}
]
}
12.返回指定字段[_source]
_source 关键字: 是⼀个数组,在数组中⽤来指定展示那些字段
GET /索引名/_search
{
"query": {
"match_all": {}
},
"_source": 要展示的指定字段数组
}
倒排索引(Inverted Index) 也叫反向索引,有反向索引必有正向索引。
通俗地来讲, 正向索引是通过key找value,反向索引则是通过value找key。
ES底层在检索时底层使⽤的就是倒排索引。
在ES中除了text类型分词,其他类型不分词,因此根据不同字段创建索引。就将文档的内容根据text字段内容先进行一个默认分词,然后将每个分词有默认的,id映射,当我们查询的时候,ES会将我们搜索条件进行分词,再用搜索的分词条件和我们数据的分词内容进行一定的算法匹配,然后找到id,再关联回我们的文档数据,形成一个命中记录集合,并根据匹配算法的匹配程度给文档打分,并返回整一个结果集
本质是使用了空间换时间的实现,搜索来了只要拿搜索关键词和我们的分词关键词比较即可,所以会很快。
注意: Elasticsearch : Elasticsearch分别为每个字段都建⽴了⼀个倒排索引。因此查询
时查询字段的term, term,就能知道⽂档ID,就能快速找到⽂档。