目录
管理 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": "完全覆盖热门"
}
}
}
官网示例:
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 元的书籍因为符合范围查询的条件,该文档已经被成功删除了。