未读代码 未读代码
首页
  • Java 18 新功能介绍
  • Java 17 新功能介绍
  • Java 16 新功能介绍
  • Java 15 新功能介绍
  • Java 14 新功能介绍
  • Java 8 新特性

    • Java 8 Lambda 表达式
    • Java 8 Stream 流式操作
    • Java 8 时间处理介绍
    • Java 8 Optional 介绍
  • Java 开发工具
Java 源码分析
Spring Boot 系列
  • Arthas 问题定位
  • JMH 基准测试
GitHub (opens new window)
首页
  • Java 18 新功能介绍
  • Java 17 新功能介绍
  • Java 16 新功能介绍
  • Java 15 新功能介绍
  • Java 14 新功能介绍
  • Java 8 新特性

    • Java 8 Lambda 表达式
    • Java 8 Stream 流式操作
    • Java 8 时间处理介绍
    • Java 8 Optional 介绍
  • Java 开发工具
Java 源码分析
Spring Boot 系列
  • Arthas 问题定位
  • JMH 基准测试
GitHub (opens new window)
  • elasticsearch

    • 全文搜索ElasticSearch(一)数据的增删改查
    • 全文搜索ElasticSearch(三)Head插件的安装与使用
    • 全文搜索ElasticSearch(二)深入搜索
      • 数据准备
      • 子条件查询
        • Query context
        • Filter context
      • 复合条件查询
        • 固定分数查询
        • 组合或关系查询
        • 组合与关系查询
        • 组合非关系查询
    • Solr7.3.0入门教程,部署Solr到Tomcat,配置Solr中文分词器
  • elasticsearch
  • elasticsearch
程序猿阿朗
2018-04-27

全文搜索ElasticSearch(二)深入搜索

全文搜索 现在,我们已经学会了如何使用 Elasticsearch 作为一个简单的 NoSQL 风格的分布式文档存储系统。我们可以将一个 JSON 文档扔到 Elasticsearch 里,然后根据 ID 检索。但 Elasticsearch 真正强大之处在于可以从无规律的数据中找出有意义的信息——从“大数据”到“大信息”。

Elasticsearch 不只会存储(stores) 文档,为了能被搜索到也会为文档添加索引(indexes) ,这也是为什么我们使用结构化的 JSON 文档,而不是无结构的二进制数据。

文档中的每个字段都将被索引并且可以被查询 。不仅如此,在简单查询时,Elasticsearch 可以使用 所有(all) 这些索引字段,以惊人的速度返回结果。这是你永远不会考虑用传统数据库去做的一些事情。

笔者使用的ElasticSearch版本:elasticsearch-5.5.1

# 数据准备

{"title":"超级玛丽秘籍","author":"王五","word_count":5000,"publish_date":"1994-11-01"}
{"title":"三国志","author":"陈寿","word_count":30000,"publish_date":"1995-11-01"}
{"title":"三国演绎","author":"罗贯中","word_count":30000,"publish_date":"1994-03-01"}
{"title":"玛丽与管道工","author":"玛丽","word_count":10000,"publish_date":"1994-03-01"}
{"title":"史记","author":"司马迁","word_count":20000,"publish_date":"1994-08-01"}
{"title":"如何蹦的更高","author":"玛丽","word_count":20000,"publish_date":"1994-08-01"}
1
2
3
4
5
6

# 子条件查询

# Query context

在查询过程中,除了判断文档是否满足查询条件外,ES还会计算一个_score来标识匹配的程度,旨在判断目标文档和查询条件匹配的有多好。

常用查询: 全文本查询,针对文本类型数据

# 全文本查询-模糊查询

POST http://localhost:9200/book/_search
{
	"query":{
		"match":{
			"title":"三国志"
		}
	}
}
// 响应
{
    "took": 4,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 2,
        "max_score": 0.99938464,
        "hits": [
            {
                "_index": "book",
                "_type": "novel",
                "_id": "AWLOAB8bQcKhhHA2xN60",
                "_score": 0.99938464,
                "_source": {
                    "title": "三国志",
                    "author": "陈寿",
                    "word_count": 30000,
                    "publish_date": "1995-11-01"
                }
            },
            {
                "_index": "book",
                "_type": "novel",
                "_id": "AWLOADU4QcKhhHA2xN61",
                "_score": 0.34450945,
                "_source": {
                    "title": "三国演绎",
                    "author": "罗贯中",
                    "word_count": 30000,
                    "publish_date": "1994-03-01"
                }
            }
        ]
    }
}
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
48

# 全文本查询-短语查询

查询书籍名字就是”三国志”的书籍信息。

POST http://localhost:9200/book/_search
{
	"query":{
		"match_phrase":{
			"title":"三国志"
		}
	}
}

1
2
3
4
5
6
7
8
9

# 全文本查询-多字段查询

POST http://localhost:9200/book/_search
{
	"query":{
		"multi_match":{
			"query":"玛丽",
			"fields":["author","title"]
		}
	}
}
1
2
3
4
5
6
7
8
9

# 全文本查询-语法查询

查询“三国”和”演绎”同时匹配的书籍信息或者可以匹配“超级玛丽”的书籍信息。

POST http://localhost:9200/book/_search
{
	"query":{
		"query_string":{
			"query":"(三国 AND 演绎) OR 超级玛丽"
		}
	}
}
1
2
3
4
5
6
7
8

指定字段的语法查询,查询标题中包含三国或者玛丽的书籍信息。

POST http://localhost:9200/book/_search
{
	"query":{
		"query_string":{
			"query":"三国 OR 玛丽",
			"fields":["title"]
		}
	}
}
1
2
3
4
5
6
7
8
9

字段级别查询,针对结构化数据,如数字,日期等

# 字段级别查询-精确查询

查询书籍字数为10000的书籍信息。

POST http://localhost:9200/book/_search
{
	"query":{
		"term":{
			"word_count":10000
		}
	}
}
1
2
3
4
5
6
7
8

# 字段级别查询-范围查询

查询书籍字数大于等于10000且小于等于20000的书籍信息,gte中的e是equals,等于的意思。

POST http://localhost:9200/book/_search
{
	"query":{
		"range":{
			"word_count":{
				"gte":10000,
				"lte":20000
			}	
		}
	}
}
1
2
3
4
5
6
7
8
9
10
11

# Filter context

在查询的过程中,只判断该文档是否满足条件,只有YES或者NO的结果。 使用Filter查询书籍字数为10000的书籍信息。

POST http://localhost:9200/book/_search
{
	"query":{
		"bool":{
			"filter":{
				"term":{
					"word_count":10000
				}
			}
		}
	}
}
1
2
3
4
5
6
7
8
9
10
11
12

# 复合条件查询

# 固定分数查询

"boost":2用于指定查询出来的信息评分都为2。

POST http://localhost:9200/book/_search
{
	"query":{
		"constant_score":{
			"filter":{
				"match":{
					"title":"三国"
				}
			},
			"boost":2
		}
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 组合或关系查询

查询作者是陈寿或者标题为三国志的书籍信息。 should表示条件之间是或的关系。

POST http://localhost:9200/book/_search
{
	"query":{
		"bool":{
			"should":[
			  {
				"match":{
					"author":"陈寿"
				}
			  },
			  {
			  	"match":{
			  		"title":"三国志"
			  	}
			  }
			]
		}
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 组合与关系查询

查询作者是陈寿或者标题为三国志的书籍信息。 Must表示条件之间是且的关系。

POST http://localhost:9200/book/_search
{
	"query":{
		"bool":{
			"must":[
			  {
				"match":{
					"author":"陈寿"
				}
			  },
			  {
			  	"match":{
			  		"title":"三国志"
			  	}
			  }
			]
		}
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 组合非关系查询

查询作者不是陈寿的书籍信息。

POST http://localhost:9200/book/_search
{
	"query":{
		"bool":{
			"must_not":{
				"match":{
					"author":"陈寿"
			  }
			}
		}
	}
}
1
2
3
4
5
6
7
8
9
10
11
12

订阅

文章持续更新,订阅可以关注「 程序猿阿朗 」公众号或者未读代码博客。

文章作者: 程序猿阿朗
文章链接:https://www.wdbyte.com/2018/04/lucene/elasticsearch-query/
版权声明:本网站当前文章采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 未读代码!
#Elasticsearch
上次更新: 2022/12/05, 08:18:32
全文搜索ElasticSearch(三)Head插件的安装与使用
Solr7.3.0入门教程,部署Solr到Tomcat,配置Solr中文分词器

← 全文搜索ElasticSearch(三)Head插件的安装与使用 Solr7.3.0入门教程,部署Solr到Tomcat,配置Solr中文分词器→

最近更新
01
如何搭建一个自己的音乐服务器
12-04
02
JUnit 5 单元测试教程
11-17
03
使用 StringUtils.split 的坑
11-02
更多文章>

提示:评论前请刷新页面,否则评论的可能不是当前文章。

Theme by Vdoing | Copyright © 2018-2022 程序猿阿朗 | MIT License | 皖ICP备20000567号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式