Elasticsearch版本为6.3.0,其他版本可能不兼容,抱歉!
基本匹配查询
- 这里有一个基本匹配查询,要在所有字段中查询字符串“李四”:
URL:GET chzhao/person/_search?q=李四
解释:q=条件
结果:
{
"took": 17,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.5753642,
"hits": [
{
"_index": "chzhao",
"_type": "person",
"_id": "seu6bmQB9V3fvhOLwzKM",
"_score": 0.5753642,
"_source": {
"name": "李四",
"desc": "Python工程师"
}
}
]
}
}
- 模糊匹配
URL:POST /chzhao/person/_search
参数:
{
"query": {
"match" : {
"desc" : "in Python"
}
},
"size": 2,
"from": 0,
"_source": ["name","desc"],
"highlight": {
"fields" : {
"name" : {}
}
}
}
结果:
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.2876821,
"hits": [
{
"_index": "chzhao",
"_type": "person",
"_id": "seu6bmQB9V3fvhOLwzKM",
"_score": 0.2876821,
"_source": {
"name": "李四",
"desc": "Python工程师"
}
}
]
}
}
- 多字段查询
URL:POST /chzhao/person/_search
参数:
{
"query": {
"multi_match" : {
"query":"Python",
"fields":[
"name",
"desc"
]
}
}
}
结果:
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.2876821,
"hits": [
{
"_index": "chzhao",
"_type": "person",
"_id": "seu6bmQB9V3fvhOLwzKM",
"_score": 0.2876821,
"_source": {
"name": "李四",
"desc": "Python工程师"
}
}
]
}
}
- 提高分值
URL:POST /chzhao/person/_search
解释:既然我们正在进行跨多字段的查询,也许想要对某个特定字段提高一些分值。在下面的人为例子中,我们将desc
字段的分值提高2
倍。提高分值不仅仅意味着计算得分被增长因子成倍的增加了,实际上提高分值的价值更在于通过它进行规范化和一些内部的优化。关于提高分值如何工作可以近一步参考Elasticsearch指南。
参数:
{
"query": {
"multi_match" : {
"query":"工程",
"fields":[
"name",
"desc^2"
]
}
}
}
结果:
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 3,
"max_score": 0.5753642,
"hits": [
{
"_index": "chzhao",
"_type": "person",
"_id": "seu6bmQB9V3fvhOLwzKM",
"_score": 0.5753642,
"_source": {
"name": "李四",
"desc": "Python工程师"
}
},
{
"_index": "chzhao",
"_type": "person",
"_id": "1",
"_score": 0.5753642,
"_source": {
"name": "王五",
"desc": "运维工程师"
}
},
{
"_index": "chzhao",
"_type": "person",
"_id": "CHE6g2QBJFDJAXuokGBo",
"_score": 0.5753642,
"_source": {
"name": "赵六",
"desc": "PHP工程师"
}
}
]
}
}
- 布尔查询
URL:POST /chzhao/person/_search
解释:为了获取更多相关且具体的结果,可以用AND/OR/NOT操作符来调整我们的搜索查询请求,在搜索API中则是用布尔查询来实施。布尔查询接收一个must参数(等价于AND)、一个must_not参数(等价于NOT)和一个should参数(等价于OR)。举个例子,比如我想查找一本书,书名里有“Elasticsearch”或“Solr”,且由“clinton gormley”所写,而非“radu gheorge”所写
参数:
{
"query": {
"bool": {
"must": {
"bool" : {
"should": [ { "match": { "desc": "工程师" }}, { "match": { "name": "赵六" }} ] }
},
"must_not": { "match": {"name": "赵六" }}
}
}
}
- 模糊查询
URL:POST /chzhao/person/_search
参数:
{
"query": {
"multi_match" : {
"query" : "王",
"fields": ["name", "desc"],
"fuzziness": "AUTO"
}
}
}
结果:
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.2876821,
"hits": [
{
"_index": "chzhao",
"_type": "person",
"_id": "1",
"_score": 0.2876821,
"_source": {
"name": "王五",
"desc": "运维工程师"
}
}
]
}
}
- 通配符查询
解释:通配符查询允许你指定匹配的模式,而不是整个术语。? 匹配任何字符,*匹配零个或多个字符。
URL:POST /chzhao/person/_search
参数:
{
"query": {
"wildcard" : {
"desc" : "*p*"
}
},
"_source": ["name", "desc"],
"highlight": {
"fields" : {
"name" : {}
}
}
}
结果:
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "chzhao",
"_type": "person",
"_id": "seu6bmQB9V3fvhOLwzKM",
"_score": 1,
"_source": {
"name": "李四",
"desc": "Python工程师"
}
}
]
}
}
- 正则表达式查询
URL:POST /chzhao/person/_search
解释:ElasticSearch还支持正则表达式查询,此方式提供了比通配符查询更加复杂的模式。
参数:
{
"query": {
"regexp" : {
"desc" : "p[a-z]*n"
}
},
"_source": ["name", "desc"],
"highlight": {
"fields" : {
"name" : {}
}
}
}
结果:
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "chzhao",
"_type": "person",
"_id": "seu6bmQB9V3fvhOLwzKM",
"_score": 1,
"_source": {
"name": "李四",
"desc": "Python工程师"
}
}
]
}
}
- 整句查询
URL:POST /chzhao/person/_search
解释:整句查询要求在请求字符串中的所有查询项必须都在文档中存在,文中顺序也得和请求字符串一致,且彼此相连。
参数:
{
"query": {
"multi_match" : {
"query": "Clint 最终对 Elasticsearch 的成功起到了重要作用。",
"fields": ["name", "desc"]
}
},
"_source": [ "name", "desc" ]
}
结果:
{
"took": 8,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 8.647883,
"hits": [
{
"_index": "chzhao",
"_type": "person",
"_id": "CXFtg2QBJFDJAXuorGC3",
"_score": 8.647883,
"_source": {
"name": "Zach",
"desc": "我仍然清晰地记得那个日子,我发布了这个开源项目第一个版本并在 IRC 聊天室创建一个频道,在那个最紧张的时刻,独自一人,急切地希望和盼望着第一个用户的到来。第一个跳进 IRC 频道的用户就是 Clint(克林顿),当时我好兴奋。好吧… 过了一会直到我发现 Clint 实际上是 Perl 用户啦,还是跟死亡讣告网站打交道。 我记得(当时)问自己为什么他不是来自于更“主流”的社区,像 Ruby 或 Python,亦或是一个稍微好点的使用案例。我真是大错特错!Clint 最终对 Elasticsearch 的成功起到了重要作用。他是第一个把 Elasticsearch 扔到生产环境中的人(还是 0.4 的版本!),初期与 Clint 的互动对于塑造 Elasticsearch 成今天的样子非常关键。对于什么是简单,Clint 有独特的见解并且他很少出错,这对 Elasticsearch 从管理、API 设计和日常使用等各个方面的易用性上面产生了很大的影响。 所以我们公司成立后不久,我们想也没想立即就联系 Clint 问他是否愿意加入我们。当我们成立公司时,我们做的第一件事就是提供公开培训。很难表达我们当时有多么紧张和担心是否真的有人会报名。但我们错了。培训到现在依然很成功,很多主要城市都还有大量的人等待参加。参加培训的人之中,有一个年轻的家伙吸引了我们注意,他的名字叫 Zach。 我们知道他有很多关于 Elasticsearch 的博客(并暗自嫉妒他用非常简单的方式来阐述复杂概念的能力),他还编写了一个 PHP 的客户端。 然后我们发现 Zach 他还是自掏腰包来参加我们的培训!你真的不能要求更多,于是我们找到 Zach,问他是否愿意加入我们的公司。Clint 和 Zach 是 Elasticsearch 能否成功的关键。他们是完美的解说家,从简单的上层应用到复杂的(Apache Lucene 的)底层逻辑。在 Elastic 这里我们非常珍惜这种独特技能。 Clint 还负责 Elasticsearch Perl 客户端,而 Zach 则负责 PHP,都是精彩的代码。最后,两位在 Elasticsearch 项目每天都在发生的大多数事情中也扮演着重要的角色。Elasticsearch 如此受欢迎的主要原因之一就是拥有与用户沟通产生共鸣的能力,Clint 和 Zach 都是这个集体的一份子,这让一切成为可能。"
}
}
]
}
}
- 请求字符串
URL:POST /chzhao/person/_search
解释:请求字符串类型(query_string)的查询提供了一个方法,用简洁的简写语法来执行多匹配查询、布尔查询、提权查询、模糊查询、通配符查询、正则查询和范围查询。
参数:
{
"query": {
"query_string" : {
"query": "(我发布了这个开源项目~1 Python~1) AND (Zach) OR (张三)",
"fields": ["_all", "desc^2"]
}
},
"_source": [ "name", "desc" ]
}
结果:
{
"took": 20,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 3.1330857,
"hits": [
{
"_index": "chzhao",
"_type": "person",
"_id": "CXFtg2QBJFDJAXuorGC3",
"_score": 3.1330857,
"_source": {
"name": "Zach",
"desc": "我仍然清晰地记得那个日子,我发布了这个开源项目第一个版本并在 IRC 聊天室创建一个频道,在那个最紧张的时刻,独自一人,急切地希望和盼望着第一个用户的到来。第一个跳进 IRC 频道的用户就是 Clint(克林顿),当时我好兴奋。好吧… 过了一会直到我发现 Clint 实际上是 Perl 用户啦,还是跟死亡讣告网站打交道。 我记得(当时)问自己为什么他不是来自于更“主流”的社区,像 Ruby 或 Python,亦或是一个稍微好点的使用案例。我真是大错特错!Clint 最终对 Elasticsearch 的成功起到了重要作用。他是第一个把 Elasticsearch 扔到生产环境中的人(还是 0.4 的版本!),初期与 Clint 的互动对于塑造 Elasticsearch 成今天的样子非常关键。对于什么是简单,Clint 有独特的见解并且他很少出错,这对 Elasticsearch 从管理、API 设计和日常使用等各个方面的易用性上面产生了很大的影响。 所以我们公司成立后不久,我们想也没想立即就联系 Clint 问他是否愿意加入我们。当我们成立公司时,我们做的第一件事就是提供公开培训。很难表达我们当时有多么紧张和担心是否真的有人会报名。但我们错了。培训到现在依然很成功,很多主要城市都还有大量的人等待参加。参加培训的人之中,有一个年轻的家伙吸引了我们注意,他的名字叫 Zach。 我们知道他有很多关于 Elasticsearch 的博客(并暗自嫉妒他用非常简单的方式来阐述复杂概念的能力),他还编写了一个 PHP 的客户端。 然后我们发现 Zach 他还是自掏腰包来参加我们的培训!你真的不能要求更多,于是我们找到 Zach,问他是否愿意加入我们的公司。Clint 和 Zach 是 Elasticsearch 能否成功的关键。他们是完美的解说家,从简单的上层应用到复杂的(Apache Lucene 的)底层逻辑。在 Elastic 这里我们非常珍惜这种独特技能。 Clint 还负责 Elasticsearch Perl 客户端,而 Zach 则负责 PHP,都是精彩的代码。最后,两位在 Elasticsearch 项目每天都在发生的大多数事情中也扮演着重要的角色。Elasticsearch 如此受欢迎的主要原因之一就是拥有与用户沟通产生共鸣的能力,Clint 和 Zach 都是这个集体的一份子,这让一切成为可能。"
},
"highlight": {
"desc": [
"我记得(当时)问自己为什么他不是来自于更“主流”的社区,像 Ruby 或 <em>Python</em>,亦或是一个稍微好点的使用案例。我真是大错特错!",
"参加培训的人之中,有一个年轻的家伙吸引了我们注意,他的名字叫 <em>Zach</em>。",
"然后我们发现 <em>Zach</em> 他还是自掏腰包来参加我们的培训!你真的不能要求更多,于是我们找到 <em>Zach</em>,问他是否愿意加入我们的公司。",
"Clint 还负责 Elasticsearch Perl 客户端,而 <em>Zach</em> 则负责 PHP,都是精彩的代码。",
"Elasticsearch 如此受欢迎的主要原因之一就是拥有与用户沟通产生共鸣的能力,Clint 和 <em>Zach</em> 都是这个集体的一份子,这让一切成为可能。"
]
}
}
]
}
}
- 简单请求字符串
URL:POST /chzhao/person/_search
解释:简单请求字符串类型(simple_query_string)的查询是请求字符串类型(query_string)查询的一个版本,它更适合那种仅暴露给用户一个简单搜索框的场景,因为,它用+/|/-分别替换了AND/OR/NOT,并且自动丢弃了请求中无效的部分,不会在用户犯错时抛出异常。
参数:
{
"query": {
"query_string" : {
"query": "(我发布了这个开源项目~1 Python~1) + (Zach) | (张三)",
"fields": ["_all", "desc^2"]
}
},
"_source": [ "name", "desc" ],
"highlight":{
"fields":{
"desc":{}
}
}
}
结果:
{
"took": 17,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 3.1330857,
"hits": [
{
"_index": "chzhao",
"_type": "person",
"_id": "CXFtg2QBJFDJAXuorGC3",
"_score": 3.1330857,
"_source": {
"name": "Zach",
"desc": "我仍然清晰地记得那个日子,我发布了这个开源项目第一个版本并在 IRC 聊天室创建一个频道,在那个最紧张的时刻,独自一人,急切地希望和盼望着第一个用户的到来。第一个跳进 IRC 频道的用户就是 Clint(克林顿),当时我好兴奋。好吧… 过了一会直到我发现 Clint 实际上是 Perl 用户啦,还是跟死亡讣告网站打交道。 我记得(当时)问自己为什么他不是来自于更“主流”的社区,像 Ruby 或 Python,亦或是一个稍微好点的使用案例。我真是大错特错!Clint 最终对 Elasticsearch 的成功起到了重要作用。他是第一个把 Elasticsearch 扔到生产环境中的人(还是 0.4 的版本!),初期与 Clint 的互动对于塑造 Elasticsearch 成今天的样子非常关键。对于什么是简单,Clint 有独特的见解并且他很少出错,这对 Elasticsearch 从管理、API 设计和日常使用等各个方面的易用性上面产生了很大的影响。 所以我们公司成立后不久,我们想也没想立即就联系 Clint 问他是否愿意加入我们。当我们成立公司时,我们做的第一件事就是提供公开培训。很难表达我们当时有多么紧张和担心是否真的有人会报名。但我们错了。培训到现在依然很成功,很多主要城市都还有大量的人等待参加。参加培训的人之中,有一个年轻的家伙吸引了我们注意,他的名字叫 Zach。 我们知道他有很多关于 Elasticsearch 的博客(并暗自嫉妒他用非常简单的方式来阐述复杂概念的能力),他还编写了一个 PHP 的客户端。 然后我们发现 Zach 他还是自掏腰包来参加我们的培训!你真的不能要求更多,于是我们找到 Zach,问他是否愿意加入我们的公司。Clint 和 Zach 是 Elasticsearch 能否成功的关键。他们是完美的解说家,从简单的上层应用到复杂的(Apache Lucene 的)底层逻辑。在 Elastic 这里我们非常珍惜这种独特技能。 Clint 还负责 Elasticsearch Perl 客户端,而 Zach 则负责 PHP,都是精彩的代码。最后,两位在 Elasticsearch 项目每天都在发生的大多数事情中也扮演着重要的角色。Elasticsearch 如此受欢迎的主要原因之一就是拥有与用户沟通产生共鸣的能力,Clint 和 Zach 都是这个集体的一份子,这让一切成为可能。"
},
"highlight": {
"desc": [
"我记得(当时)问自己为什么他不是来自于更“主流”的社区,像 Ruby 或 <em>Python</em>,亦或是一个稍微好点的使用案例。我真是大错特错!",
"参加培训的人之中,有一个年轻的家伙吸引了我们注意,他的名字叫 <em>Zach</em>。",
"然后我们发现 <em>Zach</em> 他还是自掏腰包来参加我们的培训!你真的不能要求更多,于是我们找到 <em>Zach</em>,问他是否愿意加入我们的公司。",
"Clint 还负责 Elasticsearch Perl 客户端,而 <em>Zach</em> 则负责 PHP,都是精彩的代码。",
"Elasticsearch 如此受欢迎的主要原因之一就是拥有与用户沟通产生共鸣的能力,Clint 和 <em>Zach</em> 都是这个集体的一份子,这让一切成为可能。"
]
}
},
{
"_index": "chzhao",
"_type": "person",
"_id": "seu6bmQB9V3fvhOLwzKM",
"_score": 0.47947016,
"_source": {
"name": "李四",
"desc": "Python工程师"
},
"highlight": {
"desc": [
"<em>Python</em>工程师"
]
}
}
]
}
}
- 词条/多词条查询
URL:POST /chzhao/person/_search
解释:有时我们对结构化查询更感兴趣,希望得到更准确的匹配并返回结果,词条查询和多词条查询可帮我们实现。
参数:
{
"query": {
"terms" : {
"name": ["alvin", "jack"]
}
},
"_source": [ "name", "age", "address" ],
"highlight":{
"fields":{
"desc":{}
}
}
}
结果:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1,
"hits": [
{
"_index": "alvin",
"_type": "person",
"_id": "CnGng2QBJFDJAXuo_WD6",
"_score": 1,
"_source": {
"address": "河南",
"name": "Alvin",
"age": 20
}
},
{
"_index": "alvin",
"_type": "person",
"_id": "DHGog2QBJFDJAXuo8mDD",
"_score": 1,
"_source": {
"address": "上海",
"name": "Jack",
"age": 20
}
}
]
}
}
- 词条查询 - 排序
URL:POST /alvin/person/_search
解释:词条查询的结果(和其他查询结果一样)可以被轻易排序,多级排序也被允许。
参数:
{
"query": {
"terms" : {
"address": ["河南"]
}
},
"_source": [ "name", "age", "address" ],
"sort":[
{"age":{"order":"asc"}}
]
}
结果:
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 4,
"max_score": null,
"hits": [
{
"_index": "alvin",
"_type": "person",
"_id": "CnGng2QBJFDJAXuo_WD6",
"_score": null,
"_source": {
"address": "河南",
"name": "Alvin",
"age": 20
},
"sort": [
20
]
},
{
"_index": "alvin",
"_type": "person",
"_id": "EHETh2QBJFDJAXuoTGAn",
"_score": null,
"_source": {
"address": "河南",
"name": "Lindar",
"age": "22"
},
"sort": [
22
]
},
{
"_index": "alvin",
"_type": "person",
"_id": "DnESh2QBJFDJAXuo72Bo",
"_score": null,
"_source": {
"address": "河南",
"name": "Tom",
"age": "22"
},
"sort": [
22
]
},
{
"_index": "alvin",
"_type": "person",
"_id": "D3ETh2QBJFDJAXuoJmBp",
"_score": null,
"_source": {
"address": "河南",
"name": "Lush",
"age": "22"
},
"sort": [
22
]
}
]
}
}
- 范围查询
URL:POST alvin/person/_search
备注:范围查询作用于日期、数字和字符串类型的字段。
参数:
{
"query": {
"range" : {
"age": {
"gte": "19",
"lte": "21"
}
}
},
"_source": [ "name", "age", "address" ],
"sort":[
{"age":{"order":"asc"}}
]
}
结果:
{
"took": 8,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 3,
"max_score": null,
"hits": [
{
"_index": "alvin",
"_type": "person",
"_id": "CnGng2QBJFDJAXuo_WD6",
"_score": null,
"_source": {
"address": "河南",
"name": "Alvin",
"age": 20
},
"sort": [
20
]
},
{
"_index": "alvin",
"_type": "person",
"_id": "DHGog2QBJFDJAXuo8mDD",
"_score": null,
"_source": {
"address": "上海",
"name": "Jack",
"age": 20
},
"sort": [
20
]
},
{
"_index": "alvin",
"_type": "person",
"_id": "DXGpg2QBJFDJAXuoHWBk",
"_score": null,
"_source": {
"address": "北京",
"name": "Mosson",
"age": 20
},
"sort": [
20
]
}
]
}
}
- 过滤查询
URL:POST /alvin/person/_search
参数:
{
"query": {
"bool": {
"must" : {
"multi_match": {
"query": "上海",
"fields": ["name","address"] }
},
"filter": {
"range" : {
"age": { "gte": 20 } }
}
}
},
"_source": [ "name", "age", "address" ]
}
结果:
{
"took": 9,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.6931472,
"hits": [
{
"_index": "alvin",
"_type": "person",
"_id": "DHGog2QBJFDJAXuo8mDD",
"_score": 0.6931472,
"_source": {
"address": "上海",
"name": "Jack",
"age": 20
}
}
]
}
}
- 多重过滤
URL:POST /alvin/person/_search
参数:
{
"query": {
"bool": {
"must" : {
"multi_match": {
"query": "alvin",
"fields": ["name","address"] }
},
"filter": {
"bool":{
"must":{ "range":{ "age":{ "gte":19 } } },
"should":{ "term":{ "name": "alvin" } } }
}
}
},
"_source": [ "name", "age", "address" ]
}
结果:
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.6931472,
"hits": [
{
"_index": "alvin",
"_type": "person",
"_id": "CnGng2QBJFDJAXuo_WD6",
"_score": 0.6931472,
"_source": {
"address": "河南",
"name": "Alvin",
"age": 20
}
}
]
}
}