elasticsearch的查询

405 阅读4分钟

简单查询

全文搜索

GET localhost:9200/my_doc/_search

这样查询会把my_doc索引的所有文档全部查出来。

QueryString查询

GET localhost:9200/my_doc/_search?q=desc:他很帅&q:age:20

proerties的desc属性和age属性对应的查出来

复杂查询

match匹配

支持全文搜索和精确查询,取决于字段是否支持全文检索

POST localhost:9200/my_doc/doc/_search
{
	"query":{
		"match":{
			"desc":"大学学生"
		}
	}
}

match的默认会分词匹配带有大学或者学生这两个内容,本质上是or,只要匹配其中一个就会查询到。那如果我们想全部条件都匹配上呢?通过operator来实现,

POST localhost:9200/my_doc/doc/_search
{
	"query":{
		"match":{
			"desc":{
				"query":"大学学生",
				"operator":"and"
			}
		}
	}
}

也可以按照匹配比例来查询,最小匹配比例百分之60

POST localhost:9200/my_doc/doc/_search
{
	"query":{
		"match":{
			"desc":{
				"query":"大学学生",
				"minimum_should_match""60%"
			}
		}
	}
}

exists匹配

仅展示存在该字段且值不为空的数据

POST localhost:9200/my_doc/doc/_search
{
	"query":{
		"exist":{
			"field":"username"
		}
	}
}

match_all全部匹配

把my_doc索引的所有文档全部查出来。这样查询与上文的全文查询效果差不多,但是如果你要设定分页,查询的字段等则可以自定义dsl查询

POST localhost:9200/my_doc/doc/_search
{
	"query":{
		"match_all":{
		}
	}
}

查询指定的field

_source可以指定查询出来的结果只显示指定的field

POST localhost:9200/my_doc/doc/_search
{
	"query":{
		"match_all":{
		}
	},
	"_source":[
		"id",
		"nickname"
		]
}

分页查询

POST localhost:9200/my_doc/doc/_search

{
	"query":{
		"match_all":{
		}
	},
	"_source":[
		"id",
		"nickname"
		],
	"from":0,
	"size":10
}

term和terms完全匹配

match在匹配时会对所查找的关键词进行分词,然后按分词匹配查找,而term会直接对关键词进行查找。一般模糊查找的时候,多用match,而精确查找时可以使用term。

POST localhost:9200/my_doc/doc/_search
{
	"query":{
		"term":{
			"desc":"他很帅"
		}
	},
	"_source":[
		"id",
		"nickname",
		"desc"
		]
}

terms查询与term查询一样,但它允许你指定多直进行匹配,如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件

POST localhost:9200/my_doc/doc/_search
{
	"query":{
		"terms":{
			"desc":["他很帅","学习"]
		}
	},
	"_source":[
		"id",
		"nickname",
		"desc"
		]
}

match_phrase查询

短语查询,精确匹配,查询大学毕业会匹配desc字段包含大学 毕业短语的,而不会进行分词查询,也不会查询出包含大学 其他词 毕业这样的文档,必须是连贯的内容

POST localhost:9200/my_doc/doc/_search
{
	"query":{
		"match_phrase":{
			"desc":{
				"query":"大学 毕业"
			}
		}
	},
	"_source":[
		"id",
		"nickname",
		"desc"
		]
}

slop可以短语匹配中跳过词的数量

POST localhost:9200/my_doc/doc/_search
{
	"query":{
		"match_phrase":{
			"desc":{
				"query":"大学 毕业",
				"slop":2			}
		}
	},
	"_source":[
		"id",
		"nickname",
		"desc"
		]
}

ids查询

多个id查询,_id为1001和1002都可以被查询出来

POST localhost:9200/my_doc/doc/_search
{
	"query":{
		"ids":{
			"type":"_doc",
			"values":["1001","1002"]
		}
	},
	"_source":[
		"id",
		"nickname",
		"desc"
		]
}

multi_match查询

多字段查询,比如查询color和ad字段包含单词red的文档

POST localhost:9200/my_doc/doc/_search
{
  "query": {
    "multi_match": {
      "query": "red",
      "fields": ["color","ad"]
    }
  }
}

还可以给他们设置权重,比如以color字段为主来排序。通过^来设置boost权重

{
  "query": {
    "multi_match": {
      "query": "red",
      "fields": ["color","ad^10"]
    }
  }
}

range查询

范围查询,查询价格小于1000小于50的文档

POST localhost:9200/my_doc/doc/_search

{
	"query":{
		"range":{
			"money":{
				"lt":100,
				"gt":50
			}
		}	
	},
	"_source":[
		"id",
		"nickname",
		"desc"
		]
}

post_filter后置过滤器查询

和根据条件直接检索出来数据不同,post_filter会根据query检索出来的结果再进行过滤,不会计算分数相关度。如查询money字段50-100之间的数据,你也可以使用term,match等再进行过滤

POST localhost:9200/my_doc/doc/_search

{
	"query":{
		"match":{
			"desc":"学生"
		}
	},
	"post_filter":{
		"range":{
			"money":{
				"lt":100,
				"gt":50
			}
		}	
	},
	"_source":[
		"id",
		"nickname",
		"desc"
		]
}

排序

查询默认的排序会根据score进行排序,自定义排序通过sort来实现,如下会根据age倒序,money正序来排序。但是不能对text等类型进行排序,对text类型排序需要设置附属属性。

POST localhost:9200/my_doc/doc/_search

{
	"query":{
		"match":{
			"desc":"学生"
		}
	},
	"sort":[
		{
			"age":"desc"
		},
		{
			"money":"asc"
		}
		]
}

高亮hightlight

对搜索的词汇进行高亮显示,会对分词搜索到的学生进行高亮,默认使用em标签,也可以自定义高亮的标签。

{
	"query":{
		"match":{
			"desc":"学生"
		}
	},
	"hightlight":{
		"pre_tags":["<span>"],
		"post_tags":["</span>"],
		"fields":{
			"desc":{}
		}
	}
}