ElasticSearch7.x入门教程之全文搜索(五)


前言

搜索是 ElasticSearch 最为丰富有趣的功能,也是平常在工作当中用得最多的地方。

我相信,基本上也只是用到ES的搜索,比如全文查询、词项查询、复合查询、嵌套查询、位置查询、特殊查询等等。

案例用的数据,是自己通过SpringData导入的,后面再来记录结合Java使用。
索引building_info(建筑地址索引)的mapping如下:

"mappings" : {
      "properties" : {
        "_class" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "address" : { # 搜索的全名地址
          "type" : "text",
          "analyzer" : "ik_smart"
        },
        "city_code" : { # 市
          "type" : "keyword"
        },
        "county" : {
          "type" : "keyword"
        },
        "create_time" : {
          "type" : "date"
        },
        "floor" : { # 楼层
          "type" : "keyword"
        },
        "id" : {
          "type" : "long"
        },
        "name" : { # 简称地址
          "type" : "text",
          "analyzer" : "ik_smart"
        },
        "town_office" : { # 街道办事处
          "type" : "text",
          "analyzer" : "ik_smart"
        },
        "type" : { # 房屋类型(城市住宅等)
          "type" : "keyword"
        }
      }
    }

一、全文查询:match query

  • 1、简单搜索,不写查询条件,查询所有,默认查询 前10 条记录。
GET /building_info/_search
{
  "query": {
    "match_all": {}
  }
}

# 或者
GET /building_info/_search
  • 2、分页查询,只写分页参数,es 中也可以像关系型数据库一样,给一个分页参数,指定from参数和size参数。但是es中,默认最大跨度为10000条;查询到越是后面的数据,会出现深度分页问题,官方推荐就不能这样查询了,后面再来记录官网推荐的,解决深度分页问题
GET /building_info/_search
{
  "query": {
    "match_all": {}
  },
  "from": 0, 
  "size": 20
}
  • 3、查询结果过滤返回字段
GET /building_info/_search
{
  "query": {
    "match_all": {}
  },
  "_source": ["name","address","city_code"]
}
  • 4、文档数的最小评分,有的文档得分特别低,说明这个文档和我们查询的关键字相关度很低。我们可以设置一个最低分,只有得分超过最低分的文档才会被返回。
GET /building_info/_search
{
  "query": {
    "match_all": {}
  },
  "min_score": 1.25
}
  • 5、根据关键字查询
GET /building_info/_search
{
  "query": {
    "match": {
      "address": "草堂北路"
    }
  }
}

先对草堂北路进行ik_smart分词,分解成草堂北路,分词之后,再去查询。
只要文档中包含一个分词结果,就回返回文档。换句话说,默认词项之间是 or 的关系,如果想要修改,也可以改为and

GET /building_info/_search
{
  "query": {
    "match": {
      "address": {
        "query": "草堂北路",
        "operator": "and"
      }
    }
  }
}

此时就回要求文档中必须同时包含草堂北路两个词。

  • 6、查询关键字高亮
    在这里插入图片描述默认是<em>标签,可以修改。
"highlight": {
    "fields": {
      "address": {
        "pre_tags": "<bold>",
        "post_tags": "</bold>"
      }
    }
  }

有的时候,虽然我们是在 address字段中搜索的,但是我们希望 town_office字段中,相关的关键字也能高亮:

GET /building_info/_search
{
  "query": {
    "match": {
      "address": "草堂街道办事处"
    }
  },
  "highlight": {
    "require_field_match": "false", 
    "fields": {
        "address": {},
        "town_office": {}
    } 
  }
}

结果如下:
在这里插入图片描述

  • 7、查询结果排序
    排序很简单,默认是按照查询文档的相关度来排序的,即(_score 字段):
GET /building_info/_search

# 等价于
GET /building_info/_search
{
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    }
  ]
}

然后,match_all 查询只是返回所有文档,不评分,默认按照添加顺序返回,可以通过 _doc 字段对其进行排序:

GET /building_info/_search
{
  "query": {
    "match_all": {}
  }, 
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    }
  ],
  "size": 5
}

es 同时也支持多字段排序:

GET /building_info/_search
{
  "query": {
    "match_all": {}
  }, 
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    }, 
    {
      "create_time": {
        "order": "desc"
      }
    }
  ],
  "size": 5
}

二、词项查询:term query

  • 1、单个词项查询
    就是根据词去查询,查询指定字段中包含给定单词的文档,term 查询不被分词,只有搜索的词和文档中的词精确匹配,才会返回文档。应用场景如:人名、地名等等。

比如:查询 type等于城市住宅的文档:

GET /building_info/_search
{
  "query": {
    "term": {
      "type": "城市住宅"
    }
  }
}

结果如下:
在这里插入图片描述
词项term可以添加的参数和全文match查询添加的参数大致一样,我这边就不测试了。

  • 2、多个关键词查询
GET /building_info/_search
{
  "query": {
    "terms": {
      "name": ["城市住宅", "城市住宅房", "别墅"]
    }
  }
}

三、范围查询:range query

范围查询,可以按照日期范围、数字范围等查询。

range query 中的参数主要有四个:gtltgtelte
案例:

# 楼层为大于20层,小于25GET /building_info/_search
{
  "query": {
    "range": {
      "floor": {
        "gte": 20,
        "lte": 25
      }
    }
  }
}

四、ids集合查询

这种情况下,可以传递一个id集合,优化查询。

GET /building_info/_search
{
  "query": {
    "ids": {
      "values": [36636, 36637, 36638]
    }
  }
}

总结

记录在工作当中会用到的情形,如果有新遇到的会再次添加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值