保持清醒,不断思考。

Mike lucis


  • 首页
  • 归档
  • 分类
  • 标签
  • 关于
  • 联系
  •     

© 2023 Mike lucis

Theme Typography by Makito

Proudly published with Hexo

备案号: 湘ICP备2021005917号-1

友情链接: Lonely's Bolg

ღゝ◡╹)ノ♡

ElasticSearch-匹配查询

发布于 2021-07-10 BigData  ElasticSearch 

¶ ElasticSearch 匹配查询

环境版本:
ElasticSearch 7.11.1

注意: 其请求头为:
Content-Type: application/x-ndjson

¶ 基本查询

查询当前索引下所有文档

1
GET {{url}}/library/_search

按条件查询所有文档

1
GET {{url}}/_search?q=title:guide

按条件查询文档

1
2
3
GET {{url}}/library/_search?q=title:guide
GET {{url}}/library/_search?q=name.last:mohan
GET {{url}}/library/_search?q=name.last:*a*

term 查询 (精确查询)

term 查询不会有分析器分析的过程,文档中必须包含整个搜索的词汇

1
2
3
4
5
6
7
8
9
10
GET {{url}}/library/_search
{{HEAD}}

{
"query": {
"term": {
"title": "guide"
}
}
}

terms 查询

1
2
3
4
5
6
7
8
9
10
GET {{url}}/library/_search
{{HEAD}}

{
"query": {
"term": {
"title": ["elasticsearch", "kibana"]
}
}
}

分页查询

1
2
3
4
5
6
7
8
# from定义了目标数据的偏移值,size定义当前返回的事件数目
GET {{url}}/library/_search
{{HEAD}}

{
"from": 0,
"size": 2
}

返回版本号 _version

1
2
3
4
5
6
7
8
GET {{url}}/library/_search
{{HEAD}}

{
"from": 0,
"size": 2,
"version": true
}

¶ 组合查询

¶ match 查询

match 查询时,elasticsearch 会根据你给定的字段提供合适的分析器进行分词,比如"宝马多少马力"会被分词为"宝马 多少 马力", 所有有关"宝马 多少 马力", 那么所有包含这三个词中的一个或多个的文档就会被搜索出来。

1
2
3
4
5
6
7
8
9
10
GET {{url}}/library/_search
{{HEAD}}

{
"query": {
"match": {
"title": "and"
}
}
}

¶ match_phrase 查询

match_phrase 上一个例子中,一个文档"我的保时捷马力不错"也会被搜索出来,那么想要精确匹配所有同时包含"宝马 多少 马力"的文档怎么做?就要使用 match_phrase 了, 完全匹配可能比较严,我们会希望有个可调节因子,少匹配一个也满足,那就需要使用到slop。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
GET {{url}}/library/_search
{{HEAD}}

{
"query": {
"match_phrase": {
"title": {
"query": "Elasticsearch guide",
# slop 定义的是关键词之间隔多少未知单词
"slop": 1
}
}
}
}

¶ multi_match 查询

如果我们希望两个字段进行匹配,其中一个字段有这个文档就满足的话,使用 multi_match

比如查询 title 和 preview 这两个字段里都包含 elasticsearch 关键词的文档

1
2
3
4
5
6
7
8
9
10
11
GET {{url}}/library/_search
{{HEAD}}

{
"query": {
"multi_match": {
"query": "elasticsearch",
"fields": ["title"]
}
}
}

¶ 指定返回字段

注意: 只能返回 store 为 yes 的字段

1
2
3
4
5
6
7
8
9
10
11
12
GET {{url}}/library/_search
{{HEAD}}

{
# ↓↓↓
"_source": ["title"],
"query": {
"match": {
"title": "elasticsearch"
}
}
}

¶ prefix 前缀匹配查询

1
2
3
4
5
6
7
8
9
10
11
12
GET {{url}}/library/_search
{{HEAD}}

{
"query": {
"prefix": {
"title": {
"value": "ela"
}
}
}
}

¶ fuzzy 模糊查询

value 查询关键字
boost 设置查询的权值,默认为 1.0, 默认为 0.5,对于字符串,取值为 0~1(包含 0 和 1),对于数值可能大于 1,对于日期型取值为 1d,2d,1m 这样,1d 代表一天
min_similarity 设置匹配的最小相似度
prefix_length 指明区分词的共同前缀长度,默认是 0
max_expansions 指明查询的词项可扩展的数目,默认可以无限大
1
2
3
4
5
6
7
8
9
10
GET {{url}}/library/_search
{{HEAD}}

{
"query": {
"fuzzy": {
"title": "ank"
}
}
}

¶ more_like_this 查询

fields 定义字段组。默认是 _all
like_text 定义要查询的关键词
percent_terms_to_match 该参数指明一个文档必须匹配多大比例的词项才被视为相似。默认值是 0.3,意思是30%的比例
min_term_freq 该参数指明在生成的查询中查询词项的最大数目。默认为 25
stop_words 该参数指明将被忽略的单词集合
min_doc_freq 该参数指明词项应至少在多少个文档中出现才不会被忽略。默认是 5
max_doc_freq 该参数指明出现词项的最大数目。以避免词项被忽略。默认是无限大
min_word_len 该参数指明单个单词的最小长度,低于该值的单词将被忽略,默认值是e
max_word_len 指明单个单词的最大长度.高于该值的单词将被忽略。默认是无限大
boost_terms 该参数指明提升每个单词的权重时使用的权值默认是 1
boost 指明提升一个查询的权值。默认是 1.0
analyer 指定用于分析的分析器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GET {{url}}/library/_search
{{HEAD}}

{
"query": {
"more_like_this": {
"fields": [
"title"
],
"like": "elasticsearch",
"min_term_freq": 1,
"max_query_terms": 12
}
}
}

¶ 布尔过滤查询

1
2
3
4
5
6
7
8
# 格式
{
"bool": {
"must": [],
"should": [],
"must_not": []
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 建立测试数据
POST {{url}}/store/_bulk
{{head_bulk}}

{"index":{"_id":1}}
{"price":10,"productID":"SD1002136"}
{"index":{"_id":2}}
{"price":10,"productID":"SD2678421"}
{"index":{"_id":3}}
{"price":10,"productID":"SD8897573"}
{"index":{"_id":4}}
{"price":10,"productID":"SD4535233"}
{"index":{"_id":5}}
{"price":10,"productID":"SD4310944"}
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
# 最简单 filter 查询
GET {{url}}/store/_search
{{HEAD}}

{
"query": {
"bool": {
"should": [
{
"term": {
"price": {
"value": "20"
}
}
},
{
"term": {
"productID": "sd4535233"
}
}
],
"must_not": [
{
"term": {
"price": {
"value": "30"
}
}
}
]
}
}
}
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
# 嵌套查询
GET {{url}}/store/_search
{{HEAD}}

{
"query": {
"bool": {
"should": [
{
"term": {
"price": {
"value": "10"
}
}
},
{
"bool": {
"must": [
{
"term": {
"productID": {
"value": "SD4535233"
}
}
}
]
}
}
]
}
}
}

¶ range 范围查询

范围查询用于匹配某些字段的字段值位于特定范围内的文档。Lucene查询的类型依赖于字段的类型,对于字符串字段,是TermRangeQuery,而对于数字/日期字段,查询是NumericRangeQuery。

参数 释义
gte 大于等于
gt 大于
lte 小于等于
lt 小于
boost 设置查询的推动值(boost),默认为1.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查询price字段大于等于10小于等于20的文档。
GET {{url}}/store/_search
{{HEAD}}

{
"query": {
"range": {
"price": {
"gte": 10,
"lte": 20
}
}
}
}

¶ 分析器

查看分析器解析的结果

1
2
3
4
5
6
GET {{url}}/_analyze
{{HEAD}}

{
"text": "SD4310944"
}
1
2
3
4
5
6
GET {{url}}/_analyze
{{HEAD}}

{
"text": ["SD2678421", "SD1002136"]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 重新建立一个映射,让 productID 处于 not_analyzed 模式
PUT {{url}}/store
{{HEAD}}

{
"mappings": {
"properties": {
"productID": {
"type": "text",
"index": "not_analyzed"
}
}
}
}

分享到 

 下一篇: ElasticSearch-批量操作 

© 2023 Mike lucis

Theme Typography by Makito

Proudly published with Hexo

备案号: 湘ICP备2021005917号-1

友情链接: Lonely's Bolg

ღゝ◡╹)ノ♡