前言

存储好数据之后,便可通过RESTful API进行搜索。

详细文档可参考:

--简单搜索https://www.elastic.co/guide/cn/elasticsearch/guide/cn/search.html

--深入搜索https://www.elastic.co/guide/cn/elasticsearch/guide/cn/search-in-depth.html

注:对前文的一个补充,可以使用analyze来查看分词器的分词结果。

GET _analyze
{
"analyzer": "ik_smart",
"text":"数据结构算法熟悉"
}

分词结果:

{
"tokens": [
{
"token": "数据结构",
"start_offset": 0,
"end_offset": 4,
"type": "CN_WORD",
"position": 0
},
{
"token": "算法",
"start_offset": 4,
"end_offset": 6,
"type": "CN_WORD",
"position": 1
},
{
"token": "熟悉",
"start_offset": 6,
"end_offset": 8,
"type": "CN_WORD",
"position": 2
}
]
}

基本搜索

请求路径

搜索使用GET方式,GET请求的路径中,可以包含目标索引、类型和文档 id。

/_search
在所有的索引中搜索所有的类型
/gb/_search
在 gb 索引中搜索所有的类型
/gb,us/_search
在 gb 和 us 索引中搜索所有的文档
/g*,u*/_search
在任何以 g 或者 u 开头的索引中搜索所有的类型
/gb/user/_search
在 gb 索引中搜索 user 类型
/gb,us/user,tweet/_search
在 gb 和 us 索引中搜索 user 和 tweet 类型
/_all/user,tweet/_search
在所有的索引中搜索 user 和 tweet 类型

轻量搜索

可以直接在请求url中,附加搜索关键词。

例如,查询在 tweet 类型中 tweet 字段包含 elasticsearch 单词的所有文档:

GET _all/tweet/_search?q=tweet:elasticsearch

但这种方式当条件较为复杂时,url会很难读。

请求体查询

形如:(注,有时GET不支持带请求体,因此这里的GET请求也可换成POST)

GET _search
{
"query": {
"match_all": {}
}
}

match查询

例如,查找title字段中含有python的:

GET test/_search
{
"query":{
"match":{
"title":"python"
}
}
}

返回结果:

{
"took": 48, # 耗时48ms
"timed_out": false, # 未超时
"_shards": {
"total": 5, # 共有5个分片进行查询
"successful": 5, # 5个分片成功查询
"failed": 0
},
"hits": { # 一共有3条满足条件的记录
"total": 3,
"max_score": 0.45203948, # 最高得分
"hits": [ # 以下为结果集
{
"_index": "test",
"_type": "job",
"_id": "AV3LXb9wdmPltg3H8bEu",
"_score": 0.45203948,
"_source": {
"title": "python打造推荐引擎系统",
"company_name": "阿里巴巴科技公司",
"desc": "熟悉推荐引擎的原理以及算法,掌握C语言",
"comments": 60,
"add_time": "2016-10-20"
}
}#略
]
}
}

注意

如果在一个精确字段上面使用match,则会精确匹配,比如在数字或者keyword的字段上使用。如果是text类型,则数据和查询语句都会经过分词器的处理。

例如,如果标题中为python,而查询词为大写Python,若经过ik分词,都会被转换为小写,因此仍然能查出;但如果此title字段未经分词,而是keyword类型的话,则大小写不匹配,就无法查出。

此外,match中只能指定一个查询字段。

term查询

区别是term对于查询词不会进行分词,必须精确完全匹配。

GET test/_search
{
"query":{
"term":{
"title":"python打造"
}
}
}

terms查询

可指定多个关键词进行term查询,满足其中一个关键词即可。

GET test/_search
{
"query":{
"terms":{
"title":["python打造","django"]
}
}
}

match_all查询

最简单的,查找所有。

GET test/_search
{
"query": {
"match_all": {}
}
}

match_phrase查询

在match查询中,如果对text字段指定了像“python教程”这样的查询词,会进行分词,包含python或教程的结果都会被查询出来。而match_phrase也会进行分词,但是只有全部包含这些词的结果会被查询出来。

GET test/_search
{
"query":{
"match_phrase": {
"title":{
"query":"python系统",
"slop":6
}
}
}
}

slop的含义是拆分出来的词之间的最大间距。若超出此间距,就算都包含这些词,也不会返回。

multi_match查询

match查询只能指定一个字段,而multi_match可以指定多个字段。

GET test/_search
{
"query":{
"multi_match": {
"query":"python",
"fields":["title^3","desc"]
}
}
}

上面语句是同时在title和desc中查询python关键词。注意到^3,是指定权重,title字段的权重是desc的三倍。

查询范围

查询comments中大于5小于等于60的数据:

GET test/_search
{
"query":{
"range":{
"comments":{
"gt":5,
"lte":60
}
}
}
}

查询时间大于17-4-1而且小于等于当前:

GET test/_search
{
"query":{
"range":{
"add_time":{
"gt":"2017-04-01",
"lte":"now",
"boost":2.0
}
}
}
}

(boost是权重,可有可无,别的地方也可以用)

通配符查询

查询pyt*n:

GET test/_search
{
"query":{
"wildcard":{
"title":{
"value":"pyt*n",
"boost":2.0
}
}
}
}

查询结果分页

可以进行查询结果的分页,指定从第几个开始,取几个。

GET test/_search
{
"query":{
"match":{
"title":"python"
}
},
"from":0,
"size":2
}

只返回部分字段

还是可以通过_source指定返回哪些字段。

GET test/_search
{
"_source": ["title","company_name"],
"query":{
"match":{
"title":"python"
}
}
}

返回结果排序

对comments字段按照asc升序排列(desc为降序):

GET test/_search
{
"query":{
"match":{
"title":"python"
}
},
"sort":{
"comments":{
"order":"asc"
}
}
}

bool查询

查询参数

bool查询将多查询组合在一起,它包含以下四种参数:

must

文档 必须 匹配这些条件才能被包含进来。

must_not

文档 必须不 匹配这些条件才能被包含进来。

should

如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分。

filter

必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。

简单过滤

在bool中可指定filter进行过滤。

如,使用term精确匹配出salary为20的文档:

GET test2/job/_search
{
"query":{
"bool":{
"filter":{
"term":{
"salary":20
}
}
}
}
}

如果想过滤多个值,可以用terms。

组合查询

灵活运用各种组合过滤查询。例如,下面的查询,是{salary不能为30}并且{salary为20 或者 title匹配python}

GET test2/job/_search
{
"query":{
"bool":{
"should":[
{"term":{"salary":20}},
{"match":{"title":"python"}}
],
"must_not":{
"term":{"salary":30}
}
}
}
}

嵌套查询

bool可进行嵌套。下面的例子,外层should并列两个条件或,要么标题含有python,要么必须满足标题精确匹配django而且salary精确匹配30.

GET test2/job/_search
{
"query":{
"bool":{
"should":[
{"match":{"title":"python"}},
{"bool":{
"must":[
{"term":{"title":"django"}},
{"term":{"salary":30}}
]
}}
]
}
}
}

exists

用于查询某个字段是否存在或为null。

下面例子中,前者筛选出存在title字段的文档,后者则反之。

GET test2/job2/_search
{
"query":{
"bool":{
"filter":{
"exists": {
"field": "title"
}
}
}
}
} GET test2/job2/_search
{
"query":{
"bool":{
"must_not":{
"exists": {
"field": "title"
}
}
}
}
}


经过上面的介绍,基本整理了es的搜索中的常用方法,能满足最基础的搜索使用。更详细的搜索,请参阅文档。

Elastic Search快速上手(3):搜索的更多相关文章

  1. Elastic Search快速上手(1):简介及安装配置

    前言 最近开始尝试学习Elastic Search,因此决定做一些简单的整理,以供后续参考,快速上手使用ES. 简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多 ...

  2. Elastic Search快速上手(2):将数据存入ES

    前言 在上手使用前,需要先了解一些基本的概念. 推荐 可以到 https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.htm ...

  3. Elastic Search快速上手(4):细节补充

    模糊搜索 可以进行模糊搜索: GET job/type1/_search { "query":{ "fuzzy":{ "title":{ & ...

  4. Elastic Search对Document的搜索

    在ES中使用的重点.ES中存储的数据.核心就是为了提供全文搜索能力的.搜索功能非常重要.多练. 1 query string searchsearch的参数都是类似http请求头中的字符串参数提供搜索 ...

  5. Elastic Search快速入门

    https://blog.csdn.net/weixin_42633131/article/details/82902812 通过这个篇文章可以快速入门,快速搭建一个elastic search de ...

  6. Elastic Search 小调研

    一.概况: Elastic Search 是一个基于Apache Lucene™工具包的开源搜索引擎.无论在开源还是专有领域,Lucene 可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库 ...

  7. Solutions:如何运用Elastic App Search快速建立出色的React搜索体验

    建立搜索体验是一项艰苦的工作. 乍一看似乎很容易:建立一个搜索栏,将数据放入数据库,然后让用户输入对该数据库的查询. 但是,在数据建模,底层逻辑以及(当然)总体设计和用户体验方面,有很多事情要考虑. ...

  8. Elastic App Search 快速构建 ES 应用

    公号:码农充电站pro 主页:https://codeshellme.github.io App Search 是 Elastic 家族中的一个产品,它可以帮助我们(基于 ES)快速高效的构建搜索应用 ...

  9. 教你用Elastic Search:运行第一条Hello World搜索命令

    摘要:Elastic Search可实时对数据库进行全文检索.处理同义词.从同样的数据中生成分析和聚合数据. 本文分享自华为云社区<Elastic Search入门(一): 简介,安装,运行第一 ...

随机推荐

  1. JAVA基础知识|进程与线程

    一.什么是进程?什么是线程? 操作系统可以同时支持多个程序的运行,而一个程序可以狭义的认为就是一个进程.在一个进程的内部,可能包含多个顺序执行流,而每个执行流就对应一个线程. 1.1.进程 进程:是计 ...

  2. Dubbo系列(三)dubbo的核心技术--RPC调用

    dubbo的核心技术--RPC调用:分为俩部分RPC协议Protocol和方法调用Invoke: 一.RPC协议Protocol(Remote Procedure Call)远程过程调用协议 1.我们 ...

  3. PyTricks-使用namedtuple以及dataclass的方式定义类

    from collections import namedtuple from dataclasses import dataclass # 以前简单的类可以使用namedtuple实现. Car = ...

  4. CISCO实验记录七:OSPF

    一.要求 1.使用OSPF创建路由表 2.查看OSPF邻居 二.实现 1.使用OSPF创建路由表 #router ospf 1 #network 192.168.1.0 0.0.0.255 area ...

  5. JMeter压力测试及并发量计算-2

    一个每天1000万PV的网站需要什么样的性能去支撑呢?继续上一篇,下面我们就来计算一下,前面我们已经搞到了一票数据,但是这些数据的意义还没有说.技术是为业务服务的,下面就来说说怎么让些数据变得有意义. ...

  6. Linux生成key

    [root@centos7 ~]# ssh-keygen -b [ -t rsa #这里的-b 2048 是密钥加密的长度,最好设大点 Generating public/private rsa ke ...

  7. SPSS python教程:[1]安装Python Essentials

    python机器学习-乳腺癌细胞挖掘(博主亲自录制视频)https://study.163.com/course/introduction.htm?courseId=1005269003&ut ...

  8. react native Expo适配全面屏/Expo识别全面屏和正常屏

    一.最新版本的expo已经默认支持了全面屏,即不会像react native cli一样出现底部黑边 二.但是全面屏通过Dimensions.get('window')获取的高度还是不准确,因为全面屏 ...

  9. kotlin 类的委托

    fun main(arg: Array<String>) { val baseImpl = baseImpl() demo(baseImpl).printL() } interface b ...

  10. PAT 甲级 1020 Tree Traversals (25 分)(二叉树已知后序和中序建树求层序)

    1020 Tree Traversals (25 分)   Suppose that all the keys in a binary tree are distinct positive integ ...