ElasticSearch7.10的查询数据-简单查询
官网client API
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.10/java-rest-high-getting-started.html
由于是学习阶段,用REST API进行
ElasticSearch测试用例:databooks.json。仅限学习。
https://gitee.com/springboot-search/SearchEngine.git
match query
1. 简单搜索
这个查询,对于搜索字进行分词,然后查询那个匹配的词项,文档就会被索引到。
GET 192.168.246.130:9200/books/_search
{
"query":{
"match":{
"name":"算法导论"
}
}
}
这个有243个。那么它是怎么查询的呢? 首先对算法导论分词:
分词之后进行查询,在name中只要包含有这两个词组的都会返回文档,它们之间是 or
的关系。相当于:
GET 192.168.246.130:9200/books/_search
{
"query":{
"match":{
"name":{
"query":"算法导论",
"operator":"or"
}
}
}
}
2. AND
在operator的位置设置为 and,就是要整体匹配所有字,才能得到文档。
GET 192.168.246.130:9200/books/_search
{
"query":{
"match":{
"name":{
"query":"算法导论",
"operator":"and"
}
}
}
}
这次就是查询算法导论这几个字一起查询,返回为0。
{
"took": 31,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 0,
"relation": "eq"
},
"max_score": null,
"hits": []
}
}
3. 设置最小匹配数
可以设置 minimum_should_match
属性,决定文档显示,至少要匹配分词之后的几个字中的数量。如:
{
"query":{
"match":{
"name":{
"query":"算法导论",
"minimum_should_match":"3"
}
}
}
}
显示结果至少 name
中包含3个字才行。显示为1个。
{
"took": 18,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 8.591468,
"hits": [
{
"_index": "books",
"_type": "_doc",
"_id": "795",
"_score": 8.591468,
"_source": {
"name": "科学思维的艺术科学思维方法论导论",
"publish": "科学出版社",
"type": "逻辑学",
"author": "",
"info": "当今世界,人类通过技术及其进步以越来越快的速度改造着世界和自身。然而,现代技术不是听凭人使用的简单工具,而是揭示存在、构造现实的人类技术生存方式。现代技术在给我们带来巨大物质成就的同时,也带来了社会文化、伦理道德、人类心理的危机和挑战。本书通过对技术价值的分析,提出了整合现代技术人文价值冲突的生态文化模式及实践整合的基本原则和方法。作者认为,现代技术既是解放的力量也是统治的力量,我们必须保持清醒的头脑和高度的警觉,必须将现代技术规范在人性化发展方向,探索出一条不同于西方发达国家的技术现代化道路。本书可供科技哲学及相关领域的研究者、教师和学生阅读,也适合对科学文化感兴趣的大众读者阅读。",
"price": 35
}
}
]
}
}
2. multi_match
平时在使用中,对于几个字段都进行查询,没有明确表示field,这个就可以用在这种情况。
{
"query":{
"multi_match":{
"query":"算法导论",
"fields":[
"name^3","publish","info"
],
"type":"best_fields"
}
}
}
这个 multi_search的type定义为best_fields,对于这三个字段都进行搜索,安装_score的分数进行排序,并且对于 name^3
的文档分数
进行3倍的加权。返回结果。
3. prefix query
根据字段,进行前缀查询。
GET 192.168.246.130:9200/books/_search
{
"query":{
"prefix":{
"name":"农"
}
}
}
查询出的name都是以农开头的,若是没有用农开头,也会匹配农这个字。
{
"took": 15,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "books",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"name": "测试商品",
"publish": "农村读物出版社",
"type": "小学通用",
"author": "",
"info": "",
"price": 5
}
},
{
"_index": "books",
"_type": "_doc",
"_id": "601",
"_score": 1.0,
"_source": {
"name": "小学生多功能挂图1+1:汉语拼音",
"publish": "农村读物出版社",
"type": "小学通用",
"author": "",
"info": "《小学生多功能挂图1+1:汉语拼音》这副挂图可以为孩子提供早期基础知识的初步、直观教育,有助于提高儿童智商和读写能力。提高儿童的兴趣,促进儿童学习进步等等。",
"price": 5
}
}
]
}
}
3. Term query
根据词项进行精确的匹配,不会进行分词,是整个进行查询,所以需要精确的字段值。
GET 192.168.246.130:9200/books/_search
{
"query":{
"term":{
"author":"老王"
}
}
}
结果一个都没有。老王不好找,我们直接找 王。
{
"query":{
"term":{
"author":"王"
}
}
}
结果显示56条数据。