未读代码
Java 基础
Java 新特性
Java 开发
Java 开发工具
Java 进阶
Java 性能分析
SpringBoot
其他记录
教程目录 ×
目录 [隐藏]
数据准备
子条件查询
Query context
全文本查询-模糊查询
全文本查询-短语查询
全文本查询-多字段查询
全文本查询-语法查询
字段级别查询-精确查询
字段级别查询-范围查询
Filter context
复合条件查询
固定分数查询
组合或关系查询
组合与关系查询
组合非关系查询

全文搜索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"}

子条件查询

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"
                }
            }
        ]
    }
}

全文本查询-短语查询

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

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

全文本查询-多字段查询

POST http://localhost:9200/book/_search
{
	"query":{
		"multi_match":{
			"query":"玛丽",
			"fields":["author","title"]
		}
	}
}

全文本查询-语法查询

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

POST http://localhost:9200/book/_search
{
	"query":{
		"query_string":{
			"query":"(三国 AND 演绎) OR 超级玛丽"
		}
	}
}

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

POST http://localhost:9200/book/_search
{
	"query":{
		"query_string":{
			"query":"三国 OR 玛丽",
			"fields":["title"]
		}
	}
}

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

字段级别查询-精确查询

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

POST http://localhost:9200/book/_search
{
	"query":{
		"term":{
			"word_count":10000
		}
	}
}

字段级别查询-范围查询

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

POST http://localhost:9200/book/_search
{
	"query":{
		"range":{
			"word_count":{
				"gte":10000,
				"lte":20000
			}	
		}
	}
}

Filter context

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

POST http://localhost:9200/book/_search
{
	"query":{
		"bool":{
			"filter":{
				"term":{
					"word_count":10000
				}
			}
		}
	}
}

复合条件查询

固定分数查询

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

POST http://localhost:9200/book/_search
{
	"query":{
		"constant_score":{
			"filter":{
				"match":{
					"title":"三国"
				}
			},
			"boost":2
		}
	}
}

组合或关系查询

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

POST http://localhost:9200/book/_search
{
	"query":{
		"bool":{
			"should":[
			  {
				"match":{
					"author":"陈寿"
				}
			  },
			  {
			  	"match":{
			  		"title":"三国志"
			  	}
			  }
			]
		}
	}
}

组合与关系查询

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

POST http://localhost:9200/book/_search
{
	"query":{
		"bool":{
			"must":[
			  {
				"match":{
					"author":"陈寿"
				}
			  },
			  {
			  	"match":{
			  		"title":"三国志"
			  	}
			  }
			]
		}
	}
}

组合非关系查询

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

POST http://localhost:9200/book/_search
{
	"query":{
		"bool":{
			"must_not":{
				"match":{
					"author":"陈寿"
			  }
			}
		}
	}
}