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

相关推荐
小小程序猴11 小时前
用工程化思维做企业AI培训机构对比:六维评估模型的量化实现
人工智能
高工智能汽车1 小时前
L4自动驾驶重卡,迎来关键一战?
人工智能·汽车
LaughingZhu1 小时前
Product Hunt 每日热榜 | 2026-09-20
人工智能·深度学习·神经网络·搜索引擎·百度
知几蜗牛1 小时前
Agent容器越大冷启动越慢?AWS把“加载一次”变成了快照恢复
人工智能
知几蜗牛1 小时前
AI写代码成功率升到约九成,为什么还不能叫“自动改进自己”
人工智能
55873 生态系统1 小时前
技术第2篇,五引擎微内核架构全解:调度 / 安全 / 研判 / 评测 / 存证,55873 生态系统底层技术拆解
人工智能·55873全域文明生态体系·抢救濒危文脉·55873操作系统·全域文明生态系统
老鱼说AI1 小时前
从点积到希尔伯特空间:向量内积的几何本质与大模型相似度度量
人工智能·深度学习·线性代数·算法·机器学习·数学建模
wshzd1 小时前
LLM之Agent(九十)|DeepSeek-Harness(一)安装与环境准备
人工智能
知几蜗牛1 小时前
npm自动发布最危险的一步,被拆成了“先暂存再批准”
人工智能