目录
一.创建索引&添加数据
bash
PUT /students
{
"mappings": {
"properties": {
"id": {
"type": "integer",
"index": true
},
"name": {
"type": "text",
"store": true,
"index": true,
"analyzer": "ik_smart"
},
"info": {
"type": "text",
"store": true,
"index": true,
"analyzer": "ik_smart"
}
}
}
}
POST /students/_doc/
{
"id": 1,
"name": "我爱碧海蓝天",
"info": "I love LOL"
}
POST /students/_doc/
{
"id": 2,
"name": "美羊羊",
"info": "美羊羊是羊村最漂亮的人"
}
POST /students/_doc/
{
"id": 3,
"name": "懒羊羊",
"info": "懒羊羊的成绩不是很好"
}
POST /students/_doc/
{
"id": 4,
"name": "小灰灰",
"info": "小灰灰的年纪比较小"
}
POST /students/_doc/
{
"id": 5,
"name": "沸羊羊",
"info": "沸羊羊喜欢美羊羊"
}
POST /students/_doc/
{
"id": 6,
"name": "灰太狼",
"info": "灰太狼是小灰灰的父亲,每次都会说我一定会回来的"
}
文档搜索:

二.搜索方式
1.match_all
match_all :查询所有文档

2.match
match:全文检索。 将查询条件分词后再进行搜索


搜索条件是 info域里有"喜欢"
也可以加入一句话,es会把这句话分词,只要是和这句话里的分词有关的内容都可以被搜索出来,
eg:
bash
GET /students/_search
{
"query": {
"match": {
"info": "我喜欢成绩好的"
}
}
}
输出:
bash
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4,
"relation": "eq"
},
"max_score": 2.3539653,
"hits": [
{
"_index": "students",
"_id": "5pWBtKABTkIROdfNW5iV",
"_score": 2.3539653,
"_source": {
"id": 3,
"name": "懒羊羊",
"info": "懒羊羊的成绩不是很好"
}
},
{
"_index": "students",
"_id": "85WBtKABTkIROdfNl5i-",
"_score": 1.8370843,
"_source": {
"id": 6,
"name": "灰太狼",
"info": "灰太狼是小灰灰的父亲,每次都会说我一定会回来的"
}
},
{
"_index": "students",
"_id": "6pWBtKABTkIROdfNdZgt",
"_score": 1.623463,
"_source": {
"id": 5,
"name": "沸羊羊",
"info": "沸羊羊喜欢美羊羊"
}
},
{
"_index": "students",
"_id": "55WBtKABTkIROdfNaZhS",
"_score": 0.7721133,
"_source": {
"id": 4,
"name": "小灰灰",
"info": "小灰灰的年纪比较小"
}
}
]
}
}
注:在搜索时关键词有可能会输入错误,ES搜索提供了自动纠错功能,即ES的模糊查询。使用match方式可以实现模糊查询。模糊查询对中文的支持效果一般,我们使用英文数据测试模糊查询。
bash
GET /students/_search
{
"query": {
"match": {
"info": {
"query":"lovar",
"fuzziness": 2 //最多错误字符数,不能超过2
}
}
}
}
错误字符定义:1.多了一个字符2.少了一个字符3.错了一个字符4.字符位置颠倒了
但es最多只支持错误2个字符
输出:
bash
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.0348028,
"hits": [
{
"_index": "students",
"_id": "c5V_tKABTkIROdfNUZhZ",
"_score": 1.0348028,
"_source": {
"id": 1,
"name": "我爱碧海蓝天",
"info": "I love LOL"
}
}
]
}
}
3.range
range :范围搜索。对数字类型的字段进行范围搜索



4.match_phrase
match_phrase :短语检索。搜索条件不做任何分词解析,在搜索字段对应的倒排索引中精确匹配。

5.term/terms
term/terms :单词 / 词组搜索。搜索条件不做任何分词解析,在搜索字段对应的倒排索引中精确匹配


只要有一个搜索条件匹配都可以被检索出来。
三.复合搜索

eg:略
四.结果排序
ES 中默认使用相关度分数实现排序,可以通过搜索语法定制化排序。
eg:

输出的结果当中每个相关的文档都会有一个相似度分数_score
分数越高,代表相似度越大。
还可以根据某些字段进行排序,类似于MySQL里的order by:
bash
GET /索引/_search
{
"query": 搜索条件,
"sort": [
{
"字段1":{
"order":"asc"
}
},
{
"字段2":{
"order":"desc"
}
}
]
}
Eg:
由于 ES 对 text 类型字段数据会做分词处理,使用哪一个单词做排序都是不合理的,所以 ES 中默认不允许对 text 类型的字段做排序。如果需要使用字符串做结果排序,可以使用 keyword 类型的字段作为排序依据,因为keyword 字段不做分词处理。
五.分页查询
格式:

Eg:

六.高亮查询
在进行关键字搜索时,搜索出的内容中的关键字会显示不同的颜色,称之为高亮。
为什么在浏览器的网页中关键字会显示不同的颜色,我们通过开发者工具查,看网页源码,就不难看出了。
我们可以在关键字左右加入标签字符串,数据传入前端即可完成高亮显示,ES 可以对查询出的内容中关键字部分进行标签和样式的设置。

Eg:

输出(截取一部分):

不难看出相关关键字都被加上了前缀和后缀。
七.SQL查询
在ES7之后, 支持SQL语句查询文档:

Eg:


