技.艺.道:elasticsearch常用搜索方法详解

本文深入解析Elasticsearch的六种搜索方法:简单查询、复杂查询、过滤、全文检索、短语搜索及高亮搜索,通过实例展示如何高效地进行数据检索。

零、提要

1.简单的搜索方式:query string search

2.强大的搜索方式:query DSL

3.搜索中的过滤:query filter

4.全文搜索:full-text search

5.部分内容搜索:phrase search

6.高亮搜索:highlight search

 

一、准备

环境准备:

见上一篇《技.艺.道:elasticsearch概念梳理及基础操作

数据准备:

PUT /ecommerce/product/1

{

    "name" : "gaolujie yagao",

    "desc" : "gaoxiao meibai",

    "price" : 30,

    "producer" : "gaolujie producer",

    "tags" : ["meibai","fangzhu"]

}



PUT /ecommerce/product/2

{

    "name" : "jiajieshi yagao",

    "desc" : "youxiao meibai",

    "price" : 35,

    "producer" : "gaolujie producer",

    "tags" : ["meibai","fangzhu"]

}



PUT /ecommerce/product/3

{

    "name" : "zhonghua yagao",

    "desc" : "caoben meibai",

    "price" : 20,

    "producer" : "gaolujie producer",

    "tags" : ["qingxin"]

}



PUT /ecommerce/product/4

{

  "name":"heiren yagao",

  "desc":"heiren meibai",

  "price":50,

  "producer":"heiren yagao producer",

  "tags":["meibai"]

}

二、详述

1.query string search

功能:实现简单的条件搜索

基本语法:GET /yourindex/yourtype/_search

实例-搜索全部商品:GET /ecommerce/product/_search

条件查询语法:GET /yourindex/yourtype/_search?q=name:yagao&sort=price:desc

实例-搜索name字段包含"yaogao"商品,结果按"price"字段倒序排列:GET /ecommerce/product/_search?q=name:yagao&sort=price:desc

查询结果:


 

{

  "took": 2,

  "timed_out": false,

  "_shards": {

    "total": 5,

    "successful": 5,

    "failed": 0

  },

  "hits": {

    "total": 3,

    "max_score": 1,

    "hits": [

      {

        "_index": "ecommerce",

        "_type": "product",

        "_id": "2",

        "_score": 1,

        "_source": {

          "name": "jiajieshi yagao",

          "desc": "youxiao meibai",

          "price": 35,

          "producer": "gaolujie producer",

          "tags": [

            "meibai",

            "fangzhu"

          ]

        }

      },

      {

        "_index": "ecommerce",

        "_type": "product",

        "_id": "1",

        "_score": 1,

        "_source": {

          "name": "good gaolujie yagao",

          "desc": "gaoxiao meibai",

          "price": 30,

          "producer": "gaolujie producer",

          "tags": [

            "meibai",

            "fangzhu"

          ]

        }

      },

      {

        "_index": "ecommerce",

        "_type": "product",

        "_id": "3",

        "_score": 1,

        "_source": {

          "name": "zhonghua yagao",

          "desc": "caoben meibai",

          "price": 20,

          "producer": "gaolujie producer",

          "tags": [

            "qingxin"

          ]

        }

      }

    ]

  }

}

查询结果说明:

  • took:本次查询耗时(毫秒)
  • timed_out:是否超时,这里是没有
  • _shards:数据拆成了5个分片,所以对于搜索请求,会发送至所有primary shard(或者是它的某个replica shard也可以)
  • hits.total:查询结果的数量,3个document。
  • hits.hits:包好了匹配搜索的document的详细数据。

2.query DSL(Domain Specified Language)

功能:实现复杂的条件搜索

查询所有数据:

GET /ecommerce/product/_search

{

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

}

查询“name”字段包含“yagao”的数据,结果按“price”字段的值正序排列:

GET /ecommerce/product/_search
{
	"query" : {
		"match" : {
			"name" : "yagao"
		}
	},
	"sort" : [
	  {
		  "price":"asc"
	  }
	]
}

 

范围查询:

实例:

GET /ecommerce/product/_search
{
	"query" :  {"match_all" : {} },
	"from" : 1,
	"size" : 2
}

查询指定字段:

GET /ecommerce/product/_search
{
	"query": {"match_all" : {} },
	"_source":["name","price"]
}

 

3.query filter

功能:实现数据过滤

查询出价格高于25的数据:

GET /ecommerce/product/_search
{
	"query" : {
		"bool" : {
			"must" : {
				"match" : {
					"name" : "yagao"
				}
			},
			"filter": {
				"range":{
					"price" : {"gt":30}
				}
			}
		}
	}
}

 

4.full-text search

功能:实现全文检索,即:只要“producer”字段中包含 yagao或producer都会被搜索出来,也就是说“部分匹配”的对象会被搜索到。

GET /ecommerce/product/_search
{
	"query":{
		"match" : {
			"producer":"yagao producer"
		}
	}
}

 

结果说明:

max_score:本次查询结果中最高的匹配度

hits.hits._score:具体数据的匹配度

5.phrase search

功能:短语匹配搜索,即:只有当对象的指定字段包含完整关键词时,才会被搜索出来。

跟全文检索相反,全文检索会将输入的搜索穿拆散开,去倒排索引里面去一一匹配,只要能够匹配上任意一个拆解后的单词,就可以作为结果返回phrase search

要求输入的搜索串,必须在指定的字段文本中,完全包含一模一样的,才可以算匹配,才能作为结果返回。

GET /ecommerce/product/_search
{
	"query":{
		"match_phrase":{
			"producer":"yagao producer"
		}
	}
}

 

6.highlight search

功能:搜索结果高亮显示

GET /ecommerce/product/_search
{
	"query":{
		"match" : {
			"producer":"producer"
		}
	},
	"highlight":{
		"fields" : {
			"producer" : {}
		}
	}
}

看到你的输出发现并没有哪里是高亮的对吧?难道是自己语句写错了?别担心,如果你的输出没有报“error”,只是没有高亮显示,那么你写的没错,因为这里的高亮,指的是输出的内容再html中是高亮显示的,即只是将输出结果中的关键词放到了一个<em>关键词</em>中。

输出:

{

  "took": 29,

  "timed_out": false,

  "_shards": {

    "total": 5,

    "successful": 5,

    "failed": 0

  },

  "hits": {

    "total": 4,

    "max_score": 0.25811607,

    "hits": [

      {

        "_index": "ecommerce",

        "_type": "product",

        "_id": "1",

        "_score": 0.25811607,

        "_source": {

          "name": "good gaolujie yagao",

          "desc": "gaoxiao meibai",

          "price": 30,

          "producer": "gaolujie producer",

          "tags": [

            "meibai",

            "fangzhu"

          ]

        },

        "highlight": {

          "producer": [

            "gaolujie <em>producer</em>"

          ]

        }

      },

      {

        "_index": "ecommerce",

        "_type": "product",

        "_id": "3",

        "_score": 0.25811607,

        "_source": {

          "name": "zhonghua yagao",

          "desc": "caoben meibai",

          "price": 20,

          "producer": "gaolujie producer",

          "tags": [

            "qingxin"

          ]

        },

        "highlight": {

          "producer": [

            "gaolujie <em>producer</em>"

          ]

        }

      },

      {

        "_index": "ecommerce",

        "_type": "product",

        "_id": "2",

        "_score": 0.1805489,

        "_source": {

          "name": "jiajieshi yagao",

          "desc": "youxiao meibai",

          "price": 35,

          "producer": "gaolujie producer",

          "tags": [

            "meibai",

            "fangzhu"

          ]

        },

        "highlight": {

          "producer": [

            "gaolujie <em>producer</em>"

          ]

        }

      },

      {

        "_index": "ecommerce",

        "_type": "product",

        "_id": "4",

        "_score": 0.14638957,

        "_source": {

          "name": "heiren yagao",

          "desc": "heiren meibai",

          "price": 50,

          "producer": "heiren yagao producer",

          "tags": [

            "meibai"

          ]

        },

        "highlight": {

          "producer": [

            "heiren yagao <em>producer</em>"

          ]

        }

      }

    ]

  }

}

7.倒排索引

倒排索引的意义在于“按词找文”,它是全文搜索的基础。

什么是倒排索引:

为了搞清什么是倒排索引,我们分步推演。

首先什么是索引?

我不能说索引是什么,可是我可以说它像什么。它就像是一本书的目录。我们看着目录就知道自己想看的内容在哪一页了。所以,索引的目的是让我们更快找到对象的工具。为了实现这种功能,有很多经典的实现,比如B树索引,唯一索引等等。就像一本书的目录也需要印在纸上,因此一本添加了目录的书会占用更多的书页。同理,在数据库中,一个有索引的表会占用更多的存储空间。也就是拿空间换时间。消耗更多的空间资源,节约更多的搜索时间。

倒排索引:

A数据的words字段的值:hello today dog cat

B数据的words字段的值:boby free hello fish

C数据的words字段的值:shell today hello

D数据的words字段的值:hi fish

===>

words字段的值中的词

在哪个数据出现过

hello

A,B,C

today

A,C

dog

A

cat

A

boby

B

free

B

fish

B,D

shell

C

hi

D

 

好理解吗?

再直白一点,我来讲个故事。

那是去年冬天的一个深夜,我们产品需要上线,于是我们就很自然的加了班。那天很冷,经理决定请大家吃夜宵,看了一下这么晚只有烧烤了。于是我们决定叫点烧烤撸一撸,于是开始点菜。

小张说:我要茄子,土豆,平菇,大鱿鱼,羊肉,水饺

小李说:我要韭菜,年糕,羊肉,土豆,猪腰子,水饺

小王说:我要五花肉,大鱿鱼,年糕,羊肉,牛肉

经理说:好的,我要茄子,年糕,羊肉,馄饨。

于是经理整理一下大家的菜单,怕直接发过去,老板给弄错了。于是得到下面这份订单:

菜品

点餐人

茄子

小张,经理

土豆

小张,小李

平菇

小张

大鱿鱼

小张,小王

羊肉

小张,小李,小王,经理

水饺

小张,小李

韭菜

小李

年糕

小李,小王,经理

猪腰子

小李

五花肉

小王

牛肉

小王

馄饨

经理

对,就是这样,假装我就是吃混沌那个!

简单的说就是:

正排索引:按文找词

倒排索引:按词找文

小结:方法很多,根据场景适时用即可。

<think>我们面对的问题是在使用tar命令解压Elasticsearch压缩包时出现权限不足和文件不存在的错误。根据用户提供的上下文,我们可以推断以下关键点: 1. 用户试图将文件解压到/export/servers/es/目录 2. 出现两个错误:权限不够(Permission denied)和没有文件或目录(No such file or directory) 结合引用[1]中提到的类似问题,我们可以分析: - 权限不够:可能是由于目标目录的所属用户或组与当前执行tar命令的用户不一致,当前用户没有写入权限。 - 没有文件或目录:可能是指定的目录不存在,或者tar命令无法创建该目录(同样可能是权限问题)。 具体解决步骤: 步骤1:确保目标目录存在 使用命令创建目标目录(如果不存在): sudo mkdir -p /export/servers/es/ 步骤2:修改目标目录的权限 由于当前用户(可能是普通用户)可能没有权限向/export/servers/es/目录写入,我们可以更改目录的所有者或权限。 假设当前用户名为es(根据之前sudo -l的上下文),我们可以将目录所有者改为es: sudo chown -R es:es /export/servers/es/ 或者放宽目录权限(如果安全允许): sudo chmod 755 -R /export/servers/es/ 步骤3:使用正确的用户身份执行解压 如果当前用户是es,那么可以直接执行(因为目录已经属于es): tar -zxvf elasticsearch-7.15.2-linux-x86_64.tar.gz -C /export/servers/es/ 如果当前用户不是es,可以使用es用户身份执行: sudo -u es tar -zxvf elasticsearch-7.15.2-linux-x86_64.tar.gz -C /export/servers/es/ 步骤4:检查压缩包是否存在 确保当前目录下存在elasticsearch-7.15.2-linux-x86_64.tar.gz文件,或者给出正确的路径。 另外,引用[1]中提到:如果之前用root用户创建过该目录下的文件(比如temp目录),那么普通用户(如sonar)再次操作时就会因为权限问题失败。因此,如果之前有root操作过目标目录,需要递归修改权限。 总结命令如下: ```bash # 1. 创建目标目录(如果不存在) sudo mkdir -p /export/servers/es/ # 2. 将目标目录的所有权赋予es用户(假设使用es用户运行) sudo chown -R es:es /export/servers/es/ # 3. 切换到es用户(或者使用sudo -u es执行) # 这里有两种方式,一种是先切换用户再执行,另一种是直接使用sudo -u es执行tar命令 sudo -u es tar -zxvf /path/to/elasticsearch-7.15.2-linux-x86_64.tar.gz -C /export/servers/es/ ``` 注意:如果压缩包不在当前目录,需要提供完整路径。 如果执行第三步时仍然遇到权限问题,检查: - 压缩包文件是否可读?确保es用户可以读取该压缩包(如果压缩包在某个目录,该目录至少要有执行权限,文件要有读权限) - 如果压缩包在其他用户目录,可能需要复制到es用户可读的位置,或者使用root解压到临时目录再移动到目标位置。 常见错误场景: - 压缩包路径错误:确保提供的压缩包路径正确。 - 磁盘空间不足:使用df -h检查磁盘空间。 - 内存不足:解压大文件需要一定内存。 相关问题: 1. 如何递归修改目录及其子目录的权限? 2. 使用sudo命令时如何保留环境变量? 3. 如何在Linux中检查磁盘空间和内存使用情况? 4. Elasticsearch安装后需要配置哪些系统参数? 引用说明: [^1]: 参考了FAQ中关于权限问题的类似案例。 </think>### 解决 Elasticsearch 解压权限问题的步骤 #### 1. **检查目标目录所有权** ```bash ls -ld /export/servers/es/ ``` - **问题表现**:若输出类似 `drwxr-xr-x 2 root root ...`,说明目录属于root用户 - **修复命令**: ```bash sudo chown -R $(whoami):$(whoami) /export/servers/es/ # 将目录所有权赋予当前用户 ``` > 这是引用[1]中描述的典型权限冲突场景:root用户创建的目录导致普通用户操作失败[^1] #### 2. **验证目录存在性** ```bash ls /export/servers/ ``` - **若目录不存在**: ```bash sudo mkdir -p /export/servers/es/ && \ sudo chmod 755 /export/servers/es/ ``` #### 3. **正确执行解压命令** ```bash # 确保使用完整路径(注意-C参数后需有空格) tar -zxvf "$(pwd)/elasticsearch-7.15.2-linux-x86_64.tar.gz" -C /export/servers/es/ ``` - **关键参数说明**: - `-C`:指定解压目录(目录必须存在) - `$(pwd)`:确保使用压缩包的绝对路径 #### 4. **使用sudo解压(必要时)** ```bash sudo tar -zxvf elasticsearch-7.15.2-linux-x86_64.tar.gz -C /export/servers/es/ && \ sudo chown -R $(whoami):$(whoami) /export/servers/es/ # 解压后恢复所有权 ``` #### 5. **验证解压结果** ```bash ls -l /export/servers/es/elasticsearch-7.15.2 | head -5 ``` 预期输出应包含: ``` drwxr-xr-x 2 user group 4096 bin drwxr-xr-x 3 user group 4096 config ... ``` ### 常见错误解决方案 | 错误类型 | 原因 | 修复命令 | |---------|------|---------| | `tar: /export/servers/es: Cannot open: No such file or directory` | 目录未创建 | `sudo mkdir -p /export/servers/es` | | `tar: ...: Cannot open: Permission denied` | 目录所有权错误 | `sudo chown -R $USER:$USER /export/servers/es` | | `tar: ...: Cannot utime: Operation not permitted` | 解压后权限不足 | `sudo chmod -R 755 /export/servers/es` | ### 操作流程图解 ```mermaid graph TD A[开始解压] --> B{目录存在?} B -- 否 --> C[创建目录并授权] C --> D[执行解压] B -- 是 --> E{用户有权限?} E -- 否 --> F[用sudo解压或修改所有权] F --> D E -- 是 --> D D --> G[验证文件列表] G --> H[完成] ``` ### 相关问题 1. 如何避免Elasticsearch安装过程中的权限问题? 2. Linux中如何递归修改目录所有权? 3. 解压后启动Elasticsearch报错`max file descriptors [4096]`如何解决? 4. 为什么Elasticsearch不能使用root用户运行? 5. Tar命令的`-C`参数有哪些使用限制? [^1]: 参考根目录权限冲突场景的解决方案
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值