向量数据库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:

相关推荐
涛声依旧-底层原理研究所3 分钟前
可控执行系统:企业 Agent 从演示到生产的架构重构
人工智能·架构
Data-Miner6 分钟前
不本地部署,大模型怎么安全用?
大数据·人工智能·安全
zwc32104320557 分钟前
Day 5:threshold与inRange阈值分割
c++·图像处理·人工智能·opencv·算法·计算机视觉
johnsong12 分钟前
AI前沿日报 · 2026-10-30 | 重构时刻——当基础设施开始重新洗牌
人工智能·重构
呆呆敲代码的小Y13 分钟前
【实战精选面试题】Unity精选面试题详细解答,按模块整理汇总
人工智能·游戏·unity·游戏引擎
意图共鸣19 分钟前
意图共鸣科技 · 时间胶囊(五)|认知中间层:设计思路与《认知律》
人工智能
深蓝AI3 小时前
10 万星投给了记忆:claude-mem 把编码 Agent 的断片压进 SQLite,值不值得装
人工智能·程序员
limuyang28 小时前
我在 2核2G 云主机上跑 OpenViking:一次关于云主机、模型选型与长期成本的真实复盘
人工智能·开源·ai编程
Shulex9 小时前
跨境电商 AI Agent 核心架构解析:从只读问答到自主执行的工程落地
人工智能·架构·智能客服·跨境电商