14、全文检索 -- Elasticsearch -- 管理 Elasticsearch 之 执行全文检索的操作(普通关键字、短语、前缀、通配符、范围查询 以及 根据查询条件删除文档 )

管理 Elasticsearch 之 执行全文检索的操作


一些操作上的知识点就不再赘述,基本都在这篇文章有写:在索引库中 添加、查看 和 删除 文档


执行全文检索


使用 命令 进行关键字的全文检索


执行全文检索同样向索引库后加 _search 的 URL 发送GET请求,只不过需要添加 JSON 格式的请求数据而已。


这个就是Json 格式的请求数据,可以新建一个 search.json 文件把请求数据放进来,也就是作为查询数据。
这个查询数据就是查询文档中, 【description】 这个字段的值是否有包含【村长】这两个字,有则将该文档查询检索出来

{
  "query" : { "match" : { "description" : "村长" }}
}

执行如下命令来执行全文检索:

curl -k -u elastic:e32147 -X GET https://localhost:9200/ljh_index/_search ^
-d @search.json -H "Content-Type: application/json"

如上所述,如果把查询数据统一写在 search.json 文件里面,就可以不用在命令行窗口写json格式的查询数据,创建一个 search.json 文件 ,用 -d 命令来指定读取,只是为了方便而已。


要获取指定索引库的全部文档,与使用关键字检索指定索引库的特定文档,它们发送请求的地址、GET请求都没有区别

区别只在于是否提交了请求参数,如果有请求参数,那就代表获取符合查询条件的文档;
如果没有请求参数,那就代表获取全部文档。

全文检索的数据必须是一个JSON格式的文档。

上面的json格式的查询数据,来自官网的这个示例。
把 message 改成 description 字段就可以了。

官网的示例

在这里插入图片描述


使用 postman 进行关键字的全文检索

上面说的很详细了,下面用 postman 来演示更直观。


_search 作用的解释:

查看索引库的所有文档只要在索引库后添加 /_search 即可,
如果_search后面没有查询条件,那就表明要返回该索引库下的所有文档;如果带了查询条件,那就表明要执行全文检索。

执行全文检索同样向索引库后加 _search 的 URL 发送GET请求,只不过需要添加 JSON 格式的请求数据而已。


发送的请求:https://localhost:9200/ljh_index/_search

索引库是 ljh_index ,所以要进行全文检索的话,就是在索引库后面加 _search,就是 ljh_index/_search 这个样子。
然后根据关键字进行查询的话,就需要添加 JSON 格式的请求数据,也就是JSON 格式的查询数据,
如下这个就是 JSON 格式的请求数据:

{
  "query" : { "match" : { "description" : "村长" }}
}

如图:成功检索出包含【村长】这个关键字的字段的文档

在这里插入图片描述


-u 用户登录凭证

在这里插入图片描述

-k 忽略 SSL 证书的验证

在这里插入图片描述



Elasticsearch 执行全文检索的查询语法


语法分析


Elasticsearch自己搞了一套查询语法,它要求查询参数满足JSON格式,其中query属性的值才是实际的查询参数

match ---------- 表示使用 普通关键字 查询,
regexp --------- 表示使用 正则表达式 查询
fuzzy ------------ 表示使用 模糊 查询
prefix ----------- 表示使用 前缀 查询
wildcard ------- 表示使用 通配符 查询
range ----------- 表示使用 范围 查询

也可直接用 query_string 定义查询字符串。


关于查询语法的详细示例可参考
Elasticsearch官网

在这里插入图片描述



演示例子数据展示

下面的语法查询,主要以这个文档作为查询对象来演示:

这个是添加的一个文档

在这里插入图片描述

这个是对该文档分词的效果的展示.
下面的演示,无论是什么语法,或者是什么查询语句,最终都是围绕着这个文档的分词效果来匹配的。
在这里插入图片描述



match语法:普通关键字查询

在这里插入图片描述


比如这里的 query 属性的值,也就是查询语句是 【完全覆盖热门】,Elasticsearch 也是会对这个查询的内容进行分词的。比如会分为【“完全 ”、“覆盖”、“热门” 】这三个词。
(query属性的值才是实际的查询参数)

如果 operator 属性这里指定为 and 的话,则表示 description 这个字段的值里面,必须同时出现【“完全 ”、“覆盖”、“热门” 】这三个词才能匹配成功

{
    "query": {
        "match": {
            "description": {
                "query": "完全覆盖热门",
                "operator": "and"
            }
        }
    }
}

演示:

如图:Elasticsearch 对【完全覆盖热门】会自动分词为【“完全 ”、“覆盖”、“热门” 】这三个词。

https://localhost:9200/ljh_index/_analyze

在这里插入图片描述


operator 属性值是 and,所以必须完全匹配才能查到

https://localhost:9200/ljh_index/_search

在这里插入图片描述


operator 属性值是 and,如果有一个词没匹配到,则查询不到。

如图,没有一个文档里面同时存在 【“完全 ”、“覆盖”、“热血” 】这三个词。

在这里插入图片描述


operator 属性值改为 or,则表示只要该查询语句中,有一个关键词匹配上,则能成功检索到该文档

在这里插入图片描述


简化写法:

{
    "query": {
        "match": {
            "description": "完全覆盖热门"
        }
    }
}

官网示例:

Example request

在这里插入图片描述


Match phrase语法:(短语查询)

就是即使查询语句【完全覆盖热门】会自动被 Elasticsearch 分词,但是如果用短语查询,那么相当于【完全覆盖热门】是一个整体。

比如文档内容是:xxxxxxxxxx完全覆盖热门xxxxxxxxx ,则可以匹配上。
如果文档内容是:xxxxxxx完全xxx覆盖xxx热门xxxxx ,则匹配不上。

{
    "query": {
        "match_phrase": {
            "description": "完全覆盖热门"
        }
    }
}

示例:
如图:先演示下区别,上面的普通关键字查询,只要字段里面有查询的词即可匹配上。

在这里插入图片描述


当我们用短语查询的话:
如图:可以匹配上,

在这里插入图片描述


如图:
【 完全 覆盖 社会 】这三个词虽然都在文档中出现,但它们不是一个短语,所以匹配不上
这个就是普通关键字和短语查询的区别

在这里插入图片描述


prefix查询(前缀查询)

GET /_search
{
    "query": {
        "prefix": {
            "description": {   # 指定要检索的字段
                "value": "热"   # 指定关键字的前缀
            }
        }
    }
}

这个是对该文档分词的效果的展示

在这里插入图片描述


以【社会】这个词来演示前缀查询:

演示:前缀为 【社】 字,可以看到匹配得到【社会】这个词。

在这里插入图片描述


演示:前缀为 【会】 字,可以看到,匹配不到以【会*】作为前缀的词

在这里插入图片描述

简化写法

{
    "query": {
        "prefix": {
            "description": "社会"
        }
    }
}

从上面介绍可以看出,Elasticsearch彻底抛弃了Lucene的查询语法,全面改为标准JSON格式的数据。


wildcard查询(通配符查询)


{
    "query": {
        "wildcard": {
            "description": {   # 指定要检索的字段
                "value": "sp*g",    # 指定要检索的关键词
                "boost": 1.0,       # 执行相关得分
                "rewrite": "constant_score"
            }
        }
    }
}

【“boost”: 1.0, # 执行相关得分】:就是用来控制排序,得分越高,那么排在全文检索的越前面,越先检索。


还是以【会】这个字来测试:

演示:

通配符 *+ 【会】字,可以看到,【*会】能匹配到【社会】这个词

在这里插入图片描述


 【会】字 + 通配符 *,可以看到,【会*】并不能匹配到【社会】这个词

在这里插入图片描述


不支持如下简化写法!

{
    "query": {
        "wildcard": {
            "description":  "sp*g"}
        }
    }
}

通配符检索

在这里插入图片描述


https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html

在这里插入图片描述


range查询(范围查询)

{
    "query": {
        "range": {
            "price": {
                "gte": 100,
                "lte": 140,
                "boost": 2.0
            }
        }
    }
}

演示:

在这里插入图片描述



根据查询条件删除文档

根据查询条件删除文档其实跟执行检索大同小异(难点都是写JSON格式的查询语句),

而且它们所使用的查询语句完全相同,查询时就返回符合条件的文档;删除时就删除符合条件的文档。

区别只在于两点:

1、发送请求的地址不同:

查询的发送地址是: /_search
根据查询删除文档的地址是: /_delete_by_query

2、发送请求的方法不同,查询文档要发送GET请求;如果要删除文档则发送POST请求。

若要根据查询条件来删除文档,只要向索引库(index名)后加_delete_by_query的URL发送POST请求即可。


通过 命令 演示根据查询条件删除文档

例如如下命令将会根据 search.json 指定的查询条件来删除文档:

curl -k -u elastic:e32147 -X POST https://localhost:9200/ljh_index/_delete_by_query ^
-d @search.json -H "Content-Type: application/json" 

通过 postman 演示根据查询条件删除文档

比如根据范围查询的条件来删除文档。

先查询看数据,如图,现在要把这个 139 元的书籍给删掉,可以通过这个范围查询来删除。

在这里插入图片描述

根据范围查询的条件删除文档成功

在这里插入图片描述

再次查询,可以看出 139 元的书籍因为符合范围查询的条件,该文档已经被成功删除了。

在这里插入图片描述







  • 25
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_L_J_H_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值