首页 > 其他分享 >ElasticSearch的搜索相关操作

ElasticSearch的搜索相关操作

时间:2024-03-27 20:35:37浏览次数:31  
标签:匹配 shopping 查询 搜索 query ElasticSearch 操作 分词 match

1、基本介绍

Elasticsearch 的查询是基于 JSON 风格的 DSL (Domain Specific Language)来实现的。

常见的查询类型包括:

  1. 查询所有:查询出所有数据,一般测试用。例如:match_all
  2. 全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:match、multi_match
  3. 精确查询:根据精确词条值查找数据,一般查找不分词的字段,例如keyword、数值、日期、boolean等类型字段。例如:ids、range、term
  4. 地理(geo)查询:根据经纬度查询,经纬度不分词。例如:geo_distance、geo_bounding_box
  5. 复合(compound)查询:复合查询可以将上述各种查询条件组合起来,合并查询条件。例如:bool、function_score

 

下面查询以以下数据为例:

#POST / shopping / _doc / 1001 
{
    "name": "zhangsan",
    "nickname": "zhangsan",
    "sex": "男",
    "age": 30
}

#POST / shopping / _doc / 1002 
{
    "name": "lisi",
    "nickname": "lisi",
    "sex": "男",
    "age": 20
}

#POST / shopping / _doc / 1003 
{
    "name": "wangwu",
    "nickname": "wangwu",
    "sex": "女",
    "age": 40
}

#POST / shopping / _doc / 1004 
{
    "name": "zhangsan1",
    "nickname": "zhangsan",
    "sex": "女",
    "age": 50
}

#POST / shopping / _doc / 1005 
{
    "name": "zhangsan2",
    "nickname": "zhangsan2",
    "sex": "女",
    "age": 30
}

 

2、查询所有文档数据(match_all)

查找所有文档内容,也可以这样,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON请求体,如下:

{
   "query": {
     "match_all": {}
   }
}

# "query":这里的 query 代表一个查询对象,里面可以有不同的查询属性
# "match_all":查询类型,例如:match_all(代表查询所有), match,term , range 等等
# {查询条件}:查询条件会根据类型的不同,写法也有差异

响应结果:

 

 

结果说明如下:

{
   "took【查询花费时间,单位毫秒】" : 1116,
   "timed_out【是否超时】" : false,
   "_shards【分片信息】" : {
     "total【总数】" : 1,
     "successful【成功】" : 1,
     "skipped【忽略】" : 0,
     "failed【失败】" : 0
   },
   "hits【搜索命中结果】" : {
     "total"【搜索条件匹配的文档总数】: {
       "value"【总命中计数的值】: 5,
       "relation"【计数规则】: "eq" # eq 表示计数准确, gte 表示计数不准确
     },
     "max_score【匹配度分值】" : 1.0,
     "hits【命中结果集合】" : [
       。。。
     }
   ]
   }
}

 

3、精准查询

3.1、单关键字精准查询(term)

term 查询用于执行精确匹配,精确查询不会对查询条件进行分词,它会查找指定字段中与查询值完全匹配的文档。在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/shopping/_search

{
    "query": {
        "term": {
            "name": {
                "value": "zhangsan"
            }
        }
    }
}

查询结果:

term 查询不会分词,如果此时查询条件是 "zhang" 或者 "san",此时就无法查出数据,因为没有 name 为 "zhang" 或 "san" 的数据。

 

3.2、多关键字精准查询(terms)

terms 查询和 term 查询一样,但它允许你指定一个字段对多个关键字值进行匹配。如果该字段包含了多个关键字中的任何一个值,那么这个文档满足条件,类似于 mysql 的 in。

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/shopping/_search,json 请求体如下:

{ "query": { "terms": { "name": ["zhangsan","lisi"] } }}

响应结果:

 

4、分词匹配查询(模糊查询)

4.1、单字段分词匹配(match)

match 匹配类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是 or 的关系。

match查询属于高层查询,会根据你查询的字段的类型不一致,采用不同的查询方式。

  • 如果查询的是日期或者数值的字段,他会自动将你的字符串查询内容转换成日期或者数值对待;
  • 如果查询的内容是一个不能被分词的字段(keyword),match查询不会对你的指定查询关键字进行分词;
  • 如果查询的内容是一个可以分词的字段(text),match会将你指定的查询内容根据一定的方式去分词,然后去分词库中匹配指定的内容。

总而言之:match查询,实际底层就是多个term查询,将多个term查询的结果汇集到一起返回给你。

向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/shopping/_search,请求体为 json 格式,内容如下:

{
  "query": {
    "match": {
      "name":"zhangsan"
    }
  }
}

响应结果如下:

 

4.2、多字段分词匹配查询(multi_match)

multi_match 与 match 类似,不同的是multi_match针对多个field进行检索,多个field对应一个查询的关键字。多字段匹配查询,实际上是 OR 的关系,即只要该文档中有一个字段匹配到了关键字,就能被查询出来。

向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/shopping/_search,请求为 json 格式,内容如下:

{
   "query": {
     "multi_match": {
       "query": "zhangsan",
       "fields": ["name","nickname"]
     }
   }
}

响应结果如下:

 

3.4、短语分词匹配查询(match_phrase)

match_phrase 查询是一种用于匹配短语的查询方式,它会将查询字符串分解成单词,然后按照顺序匹配文档中的单词,只有目标文档需要包含分词后的所有词,且目标文档中单词顺序与查询字符串中的单词顺序完全一致时才会匹配成功。

match_phrase 与match 都会进行分词,但不同的是,match查询只需要匹配查询中的一个或多个单词即可,而且不需要考虑单词的顺序。例如,如果查询是“quick brown fox”,match查询将匹配包含“quick”、“brown”或“fox”的文档,且不管它们的顺序如何。相比之下,match_phrase查询只会匹配包含完全短语“quick brown fox”的文档。

在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:

{
    "query":{
        "match":{
            "title" : "修改后"
        }
    }
}

响应结果:

 

5、模糊查询

ES 支持多种模糊查询,包括Wildcard查询、Fuzzy查询、Regexp查询和Match查询(match 查询实际上也是一种模糊查询)。这些查询可以用于执行模糊匹配、拼写纠错、范围查询等操作。

 

5.1、Wildcard 查询(通配符)

Wildcard 查询是一种基于通配符的查询,它使用单个字符(?)代表一个字符,使用星号(*)代表零个或多个字符。Wildcard 查询可用于对单个词执行模糊匹配,也可以用于对短语进行模糊匹配。它可以在搜索中用于查找某些词汇的变体或拼写错误的单词。

例如,以下查询将匹配包含任何以“elasti”开头的文档:

GET /my_index/_search

{
  "query": {
    "wildcard": {
      "title": "elasti*"
    }
  }
}

 

5.2、Fuzzy 查询(相似单词)

Fuzzy 查询是一种模糊查询,可以用于查询包含与搜索字词相似的字词的文档,它可以用于拼写纠错等操作。

Fuzzy 查询使用编辑距离算法计算文本之间的相似度,编辑距离是将一个术语转换为另一个术语所需的一个字符更改的次数。这些更改可以包括:

  • 更改字符(box → fox)
  • 删除字符(black → lack)
  • 插入字符(sic → sick)
  • 转置两个相邻字符(act → cat)

为了找到相似的术语,fuzzy 在查询时会在指定的编辑距离内创建一组搜索词的所有可能的变体或扩展,然后再查询并返回每个扩展的完全匹配。

以下是一个使用 Fuzzy 查询的示例:

GET /my_index/_search

{
  "query": {
    "fuzzy": {
      "title": {
        "value": "elasticsearch",
        "fuzziness": "AUTO"
      }
    }
  }
}

在上面的示例中,查询将返回所有与 "elasticsearch" 相似的文档。Fuzziness 参数可以指定编辑距离的最大值,它可以是一个整数,一般可不指定即为  "AUTO" 值,表示 Elasticsearch 将自动根据术语的长度计算最佳的编辑距离值。

 

5.3、Regexp 查询

Regexp 查询是一种基于正则表达式的查询,它可以用于在文本中查找匹配指定正则表达式的单词或短语。Regexp 查询非常灵活,但由于它需要对所有文档进行扫描,因此可能会影响性能。

以下是一个使用 Regexp 查询的示例,在下面的示例中,查询将匹配所有以 "elasticsearch" 开头的单词或短语的文档。

GET /my_index/_search

{
  "query": {
    "regexp": {
      "title": "elasticsearch.*"
    }
  }
}

 

6、多条件查询之must(相当于and)

`bool`把各种其它查询通过`must`(必须 )、`must_not`(必须不)、`should`(应该)的方式进行组合。

假设想找出小米牌子,且价格为3999元的。(must相当于数据库的and),在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:

{
    "query":{
        "bool":{
            "must":[{
                "match":{
                    "category":"小米"
                }
            },{
                "match":{
                    "price":3999.00
                }
            }]
        }
    }
}

 

7、多条件查询之should(相当于or)

假设想找出小米或华为的牌子。(should相当于数据库的||),在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:

{
    "query":{
        "bool":{
            "should":[{
                "match":{
                    "category":"小米"
                }
            },{
                "match":{
                    "category":"华为"
                }
            }]
        },
        "filter":{
            "range":{
                "price":{
                    "gt":2000
                }
            }
        }
    }
}

 

8、范围查询(range)

range 查询找出那些落在指定区间内的数字或者时间。range 查询允许以下字符:

 

假设想找出小米或华为的牌子,且价格大于2000元的手机。在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:

{
    "query":{
        "bool":{
            "should":[{
                "match":{
                    "category":"小米"
                }
            },{
                "match":{
                    "category":"华为"
                }
            }],
            "filter":{
                "range":{
                    "price":{
                        "gt":2000
                    }
                }
            }
        }
    }
}

 

9、分页查询(from、size)

向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:

{
    "query":{
        "match_all":{}
    },
    "from": 2,   //码数索引,从0开始。如2,即表示从第3条开始,查询size条
    "size":2
}

 

10、查询排序(sort)

如果你想通过排序查出价格最高的手机,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:

{
    "query":{
        "match_all":{}
    },
    "sort":{
        "price":{
            "order":"desc"
        }
    }
}

 

11、高亮查询(highlight)

在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:

{
    "query":{
        "match_phrase":{
            "category" : "为"
        }
    },
    "highlight":{
        "fields":{
            "category":{}//<----高亮这字段
        }
    }
}

返回结果如下:

 

标签:匹配,shopping,查询,搜索,query,ElasticSearch,操作,分词,match
From: https://www.cnblogs.com/wenxuehai/p/18100158

相关文章

  • 文件操作(上)(想要了解如何操作文件,那么看这一片就足够了!)
        前言:在我们写的程序的的时候,数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,那么如果要将数据进行持久化的保存,我们就可以使用文件进行存储数据。✨✨✨这里是秋刀鱼不做梦的BLOG✨✨✨想要了解更多内容可......
  • 二进制部署elasticsearch集群
    部署elasticsearch7.17.3版本背景:  业务有需求看evenet事件,由于etcd集群中的eventkey频繁打到200w+,对etcd集群压力非常大,每次都需要手动删除eventkey,非常耗时间,而且风险特别好,恢复时间慢等缺点。解决方案:  1,拆分etcd集群中的eventkey,在本机上创建一个新的etcd集群,......
  • 【Postman如何进行接口测试简单详细操作实例】
    1、下载Postmanpostman下载地址:DownloadPostman|GetStartedforFree2、安装Postman(1)双击下载好的postman-setup.exe文件,进行安装postman工具(2)安装完成后,在桌面找到并打开postman软件,输入邮箱和密码进行登录,没有就新建注册一个账号,登录进入到postman首页。3、大......
  • Python中的datetime模块:轻松拿捏时间操作
    前言在Python中,处理日期和时间是非常常见的任务,无论是在开发Web应用程序、数据分析还是其他领域。datetime模块为我们提供了丰富的功能,可以轻松处理日期和时间,从简单的日期算术运算到复杂的时区转换,应有尽有。本文将深入探讨datetime模块的功能和用法,帮助大家轻松拿捏时间操作。......
  • Qt 操作sql server数据库
    Qt操作sqlserver数据库添加qtsql的库连接数据库QSqlDatabase_db=QSqlDatabase::addDatabase("QODBC");_db.setHostName();_db.setDatabaseName();_db.setUserName();_db.setPassword();_db.setPort();_db.open();增QSqlQueryquery;query.prepare("INSER......
  • Elasticsearch 8.x以上实现初始化用户密码,elasticsearch-setup-passwords interactive
    Elasticsearch8.x以上,默认自动开启x-pack验证,在首次启动时,会设置密码,当再次执行elasticsearch-setup-passwordsinteractive就会报错,提示使用elasticsearch-reset-passwords,但是用户太多,还是想要能像8.x以下一直敲回车,设置密码。今天偶然Elasticsearch报错,发现一个方法可以使用,......
  • elasticsearch esrally 性能测试实操
    目录准备数据docker测试环境准备正式测试最新在用esrally测试es的性能,今天把相关操作记录下。本人非专业测试,各位大佬请轻喷。关于esrally的文档,请移步:esrally测试esrally是个elastic官方的测试工具,可以对es进行压力测试。其运行对环境有一定要求,如python版本,JDK......
  • 操作系统高级议题:并发控制与进程互斥技术
    ✨✨欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨......
  • 从入门到精通:GPS北斗卫星校时服务器 操作指南
    从入门到精通:GPS北斗卫星校时服务器操作指南从入门到精通:GPS北斗卫星校时服务器操作指南京准电子科技官微——ahjzsz一、产品功能卫星时钟服务器是一款采用GPS或北斗卫星提供高精度网络时间服务的产品。卫星天线安装简便(根据天线所放位置提示实时卫星颗数),接口可支持以太网1......
  • python 列表基本操作
    python列表基本操作一、列表基本操作1.列表2.访问列表中的值3.更新列表4.删除列表元素5.Python列表脚本操作符6.Python列表截取与拼接7.嵌套列表8.列表比较9.Python列表函数&方法二、代码概述一、列表基本操作1.列表序列是Python中最基本的数据结构......