社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Elasticsearch

Elasticsearch篇之Search API介绍

我都不会 • 5 年前 • 306 次点击  

Elasticsearch篇之Search API介绍

1 SearchAPI概览

实现对es中存储的数据进行查询分析,endpoint为_search,如下所示:
在这里插入图片描述
查询主要有两种形式
在这里插入图片描述

2 URISearch详解与演示

通过url query参数来实现搜索,常用参数如下:

  • q指定查询的语句,语法为Query String Syntax
  • df q中不指定字段时默认查询的字段,如果不指定,es会查询所有字段
  • sort 排序
  • timeout 指定超时时间,默认不超时
  • from、size 用于分页
    在这里插入图片描述
  • term 与 phrase
    • alfred way 等效于 alfred or way
    • “alfred way”词语查询,要求先后排序
  • 泛查询
    • alfred 等效于在所有字段中去匹配该term
  • 指定字段
    • name:aflred
  • Group分组设定,使用括号指定匹配的规则
    • (quick OR brown)AND fox
    • status:(active OR pending) title:(full text search)
      创建索引,生成测试文档
PUT my_index_search
{
  "settings": 
  {
    "number_of_shards": "5",
    "number_of_replicas": "0"
  }
}
POST my_index_search/doc/_bulk
{"index":{"_id": "1"}}
{"username": "alfred way","job": "java engineer","age": 18,"birth": "1990-01-02","isMarried":false}
{"index":{"_id": "2"}}
{"username": "alfred","job": "java senior and java specialist","age": 28,"birth": "1980-05-07","isMarried":true}
{"index":{"_id": "3"}}
{"username": "lee","job": "java and ruby engineer","age": 22,"birth": "1985-08-07","isMarried":false}
{"index":{"_id": "4"}}
{"username": "alfred junior way","job": "ruby engineer","age": 23,"birth": "1989-08-02","isMarried":false}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
# 查询所有字段中有alfred的文档
GET my_index_search/_search?q=alfred
# 设置profile可以看具体的查询语句
GET my_index_search/_search?q=alfred
{
  "profile": true
}
GET my_index_search/_search?q=username:alfred
GET my_index_search/_search?q=username:alfred
{
  "profile": true
}
# username:alfred和way是OR的关系
GET my_index_search/_search?q=username:alfred way
{
  "profile": true
}
# PhraseQuery词语的查询
GET my_index_search/_search?q=username:"alfred way"
{
  "profile": true
}
# "description": "username:alfred username:way" 下面描述
GET my_index_search/_search?q=username:(alfred way)
{
  "profile": true
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 布尔操作符
  • AND(&&) OR(||) NOT(!)
  • name:(tom NOT lee)
  • 注意大写,不能小写
  • + - 分别对应must和must_not
  • name:(tom +lee -alfred) 或者 name:((lee && !alfred)||(tome && lee && !alfred))
  • + 在url中会被解析为空格,要使用encode后才可以,为%2B
GET my_index_search/_search?q=username:alfred AND way
{
  "profile": true
}
GET my_index_search/_search?q=username:(alfred AND way)
{
  "profile": true
}
GET my_index_search/_search?q=username:(alfred NOT way)
{
  "profile": true
}
GET my_index_search/_search?q=username:(alfred +way)
{
  "profile": true
}
GET my_index_search/_search?q=username:(alfred %2Bway)
{
  "profile": true
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 范围查询,支持数值和日期
    • 区间写法,闭区间用[],开区间{}
      • age:[1 TO 10]意为 1<=age<=10
      • age:[1 TO 10}意为 1<=age<10
      • age:[1 TO]意为 age>=1
      • age:{* TO 10]意为age<=10
    • 算术符号写法
      • age:>=1
      • age:(>=1 && <=10)或者 age:(+>=1 +<=10)
GET my_index_search/_search?q=username:alfred age:>20
GET my_index_search/_search?q=username:alfred AND age:>20
GET my_index_search/_search?q=birth:(>1980 AND <1990)
  • 1
  • 2
  • 3
  • 通配符查询
  • ? 代表1个字符, * 代表0或多个字符
    • name:t?m
    • name:tom*
    • name:t*m
  • 通配符匹配执行效率低,且占用较多内存,不建议使用
  • 如无特殊需求,不要将?/ * 放在最前面
GET my_index_search/_search?q=username:alf*
  • 1
  • 正则表达式匹配
GET my_index_search/_search?q=username:/[a]?l.*/
  • 1
  • 模糊匹配fuzzy query
  • name:roam~1
  • 匹配roam差1个character的词,比如foam、roams等
  • 近似度查询proximity search
  • “fox quick”~5
  • 以term为单位进行差异比较,比如“quick fox” “quick brown fox”都会被匹配
GET my_index_search/_search?q=username:alfed~1
GET my_index_search/_search?q=job:"java engineer"~2
  • 1
  • 2

3 QueryDSL简介

将查询语句通过http request body发送到es,主包含如下参数:

  • query符合Query DSL 语法的查询语句
  • from、size
  • timeout
  • sort

  • 在这里插入图片描述
  • 基于JSON定义的查询语言,主要包含如下两种类型:
    • 字段类查询
      • 如term、math、range等,只针对某一个字段进行查询
    • 符合查询
      • 如bool查询等、包含一个或多个字段类型查询或者复合查询语句

4 字段类查询简介及match-query

  • 字段类查询主要包括以下两类:

  • 全文匹配

    • 针对text类型的字段进行全文检索,会对查询语句先进行分词处理,如match、match_phrase等query类型
  • 单词匹配

    • 不会对查询语句做分词处理,直接去匹配字段的倒排索引,如term、terms、range等query类型
  • 对字段作全文检索,最基本和常用的查询类型,API实例如下:
    在这里插入图片描述

GET my_index_search/_search
{
  "query": {
    "match": {
      "username": "alfred way"
    }
  }
}
# 查看查询语句
GET my_index_search/_search
{
  "profile": true,
  "query": {
    "match": {
      "username": "alfred way"
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

在这里插入图片描述

  • 通过operator参数可以控制单词间的匹配关系,可选项为or和and
    在这里插入图片描述
GET my_index_search/_search
{
  "profile": true,
  "query": {
    "match": {
      "username": {
        "query": "alfred way",
        "operator": "and"
      }
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 通过minmun_should_match参数可以控制需要匹配的单词数
    在这里插入图片描述
GET my_index_search/_search
{
  "profile": true,
  "query": {
    "match": {
      "job": {
        "query": "java ruby engineer",
        "minimum_should_match": 2
      }
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

5 相关性算分

在这里插入图片描述

  • 相关性算分是指文档与查询语句间的相关度,英文为relevance
    • 通过倒排索引可以获取与查询语句相匹配的文档列表
    • 本质是一个排序问题,排序的依据是相关性算分
      在这里插入图片描述
  • 相关性算分的几个重要概念如下:
    • Term Frequency(TF)词频,即单词在该文档中出现的次数。词频越高,相关度越高
    • Document Frequency(DF)文档频率,即单词出现的文档树
    • Inverse Document Frequency(IDF)逆向文档频率,与文档频率相反,简单理解为1/DF。即单词出现的文档数越少,相关度越高
    • Field-length Norm文档越短,相关度越高
  • ES目前主要有两个相关性算分模型,例如:
    • TF/IDF模型
      在这里插入图片描述
      在这里插入图片描述
    • BM25模型 5.x之后的默认模型
      在这里插入图片描述
      在这里插入图片描述

6 match-phrase-query

  • 对字段检索,有顺序要求,API示例如下
    在这里插入图片描述
    在这里插入图片描述



    
GET my_index_search/_search
{
  "profile": true,
  "query": {
    "match_phrase": {
      "job": {
        "query": "java engineer"
      }
    }
  }
}
GET my_index_search/_search
{
  "profile": true,
  "query": {
    "match_phrase": {
      "job": {
        "query": "engineer java"
      }
    }
  }
}
GET my_index_search/_search
{
  "profile": true,
  "query": {
    "match_phrase": {
      "job": {
        "query": "java engineer",
        "slop": 1
      }
    }
  }
}

GET my_index_search/_search
{
  "profile": true,
  "query": {
    "match_phrase": {
      "job": {
        "query": "java engineer",
        "slop": 2
      }
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

7 query-string-query

在这里插入图片描述
在这里插入图片描述

GET my_index_search/_search
{
  "query": {
    "query_string": {
      "default_field": "username",
      "query": "alfred AND way"
    }
  }
}
GET my_index_search/_search
{
  "profile": true,
  "query": {
    "query_string": {
      "fields": [
          "username",
          "job"
        ],
      "query": "alfred OR (java AND ruby)"
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

8 simple-query-string-query

  • 类似Query String,但是会忽略错误的查询语法,并且仅支持部分查询语法
  • 其常用的逻辑符号如下、不能使用AND、OR、NOT等关键词:
    • + 代指AND
    • | 代指OR
    • - 代指NOT
      在这里插入图片描述
# 必须包含away,可以包含alfred
GET my_index_search/_search
{
  "profile": true,
  "query": {
    "simple_query_string": {
      "query": "alfred +way",
      "fields": ["username"]
    }
  }
}
GET my_index_search/_search
{
  "profile": true,
  "query": {
    "simple_query_string": {
      "query": "alfred +way AND java",
      "fields": ["username"]
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

query_string和simple_query_string的对比

GET my_index_search/_search
{
  "profile": true,
  "query": {
    "query_string": {
      "fields": ["username"],
      "query": "alfred OR (\"java AND ruby)"
    }
  }
}
GET my_index_search/_search
{
  "profile": true,
  "query": {
    "simple_query_string": {
      "query": "alfred +way AND \"java",
      "fields": ["username"]
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

9 term/terms-query

  • term-query将查询语句作为整个单词进行查询,即不对查询语句做分词处理,如下所示:
    在这里插入图片描述
  • terms-query一次传入多个单词进行查询,如下所示:
    在这里插入图片描述
# term query
GET my_index_search/_search
{
  "profile": true,
  "query": {
    "term": {
      "username": "alfred"
    }
  }
}
GET my_index_search/_search
{
  "profile": true,
  "query": {
    "term": {
      "username": "alfred way"
    }
  }
}
# terms query
GET my_index_search/_search
{
  "profile": true,
  "query": {
    "terms": {
      "username": [
        "alfred",
        "way"
      ]
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

10 range-query

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

GET my_index_search/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}
GET my_index_search/_search
{
  "query": {
    "range": {
      "birth": {
        "gte": "1980-01-01"
      }
    }
  }
}
GET my_index_search/_search
{
  "query": {
    "range": {
      "birth": {
        "gte": "now-35y"
      }
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

11 复合查询介绍及ConstantScore

12 bool-query

13 count-and-source-filtering

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/52917
 
306 次点击