本文已参与「新人创作礼」活动,一起开启掘金创作之路。
近期在工作中需要使用es进行简单的全文检索,所以最近都在边学边做笔记,也会把自己遇到的bug以及如何解决的,一并记录在这里,供大家学习参考。
ElasticSearch的复杂查询
1.查询匹配
match:匹配(会使用分词器解析(先分析文档,然后进行查询))_source:过滤字段sort:排序from、size分页
GET /test_user/_search
{
"query":{
"match":{
"name":"lisi"
}
},
"_source": ["name","age"],
"sort": [
{
"age": {
"order": "asc"
}
}
],
"from": 0,
"size": 1
}
2.多条件匹配
must等价于andshould等价于ormust_not等价于not(... and ...)filter过滤
GET /blog/user/_search
{
"query":{
"bool": {
"must": [
{
"match":{
"age":3
}
},
{
"match": {
"name": "流"
}
}
],
"filter": {
"range": {
"age": {
"gte": 1,
"lte": 3
}
}
}
}
}
}
3.匹配数组
- 可以多关键字(空格隔开)
GET /test_user/_search
{
"query":{
"match":{
"name":"lisis zhangsan"
}
}
}
4.精确查找
term直接通过倒排索引指定词条查询- 适合查询number、date、keyword,不适合text
- 精确查找(必须全部都有,而且不可分,即按一个完整的词查询)
GET /test_user/_search
{
"query":{
"term":{
"name":"zhangsan"
}
}
}
5.text和keyword
- text:
- 支持分词,全文检索、支持模糊、精确查询,不支持聚合,排序操作;
- text类型的最大支持的字符长度无限制,适合大字段存储;
- keyword:
- 不进行分词,直接索引、支持模糊、支持精确匹配,支持聚合、排序操作。
- keyword类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。 6.高亮查询
GET /test_user/_search
{
"query": {
"match": {
"name":"zhangsan"
}
}
,
"highlight": {
"fields": {
"name": {}
}
}
}
GET /test_user/_search
{
"query": {
"match": {
"name":"zhangsan"
}
}
,
"highlight": {
"pre_tags": "<p class='key' style='color:red'>",
"post_tags": "</p>",
"fields": {
"name": {}
}
}
}