向量数据库Elasticsearch(四)搜索文档——各种方式

目录

一.创建索引&添加数据

二.搜索方式

1.match_all

2.match

3.range

4.match_phrase

5.term/terms

三.复合搜索

四.结果排序

五.分页查询

六.高亮查询

七.SQL查询


一.创建索引&添加数据

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:

相关推荐
蜡台6 小时前
AI Agent 架构终极教程:从原理分层、四大范式到生产级落地实战
网络·人工智能·架构
乐维_lwops6 小时前
2026选择运维监控系统时应该重点考察哪些功能?
大数据·运维·人工智能
小新科研测评6 小时前
文献管理工具同步太麻烦?2026年4款多端同步工具实测,换设备不丢笔记
论文阅读·人工智能·笔记·ai·电脑
Elasticsearch6 小时前
使用 Elastic Stack 丰富邮政地址信息 —— 第三部分
elasticsearch
EchoMind-Henry6 小时前
DeepSeek换个位置,检索准确率差40.2个百分点?
人工智能·机器学习
ifenxi爱分析6 小时前
爱分析发布《2026 爱分析·Data+AI应用实践报告》
大数据·人工智能
Thuni_soft6 小时前
华宇亮相2026药品数智发展大会:AI助推医疗器械审评审批提质增效
大数据·人工智能
通信大模型6 小时前
Aerial Agentic AI:面向低空无线网络的 LLM 与 SLM 协同框架
人工智能
Elasticsearch6 小时前
使用 Elastic Stack 丰富邮政地址信息 —— 第二部分
elasticsearch