日期、布尔类型和数字都是结构化数据,文本也可以是结构化的,比如彩色笔可以有离散的颜色集合:红(red)、绿(green)、蓝(blue)。或者如一个博客标记的标签,如分布式(distributed)和搜索(search)等。
结构化搜索(Structured search)是指对结构化数据的搜索。布尔、时间、日期和数字这类结构化数据有精确的格式,我们可以对这些格式进行逻辑操作。包括比较数字或时间的范围以及判定两个值的大小等。而对于结构化文本可以做精确匹配或者部分匹配,比如采用 Term 查询或者 Prefix 前缀查询。
下面进行举例介绍下结构化数据的查询,先批量存入示例文档:
1 2 3 4 5 6 7 8 9
| POST /products/_bulk { "index": { "_id": 1 }} { "price" : 10,"avaliable":true,"date":"2018-01-01", "productID" : "XHDK-A-1293-#fJ3" } { "index": { "_id": 2 }} { "price" : 20,"avaliable":true,"date":"2019-01-01", "productID" : "KDKE-B-9947-#kL5" } { "index": { "_id": 3 }} { "price" : 30,"avaliable":true, "productID" : "JODL-X-1937-#pV7" } { "index": { "_id": 4 }} { "price" : 30,"avaliable":false, "productID" : "QQPX-R-3956-#aD8" }
|
下面通过布尔值字段检索匹配的文档,这里检索的值既可以是 true
或者是文本 "true"
,检索数值类型字段时同理:
1 2 3 4 5 6 7 8
| POST products/_search { "query": { "term": { "avaliable": true } } }
|
ES 支持通过对数字进行范围查询,比如查询价格大于等于 20 且小于等于 30 的数据,示例如下:
1 2 3 4 5 6 7 8 9 10 11
| GET products/_search { "query" : { "range" : { "price" : { "gte" : 20, "lte" : 30 } } } }
|
其中 gt(大于)、lt(小于)、get(大于等于)、lte(小于等于)。
可以对日期进行范围查询,例如查询大于等于一年前的数据,示例如下:
1 2 3 4 5 6 7 8 9 10 11
| POST products/_search { "query" : { "range" : { "date" : { "gte" : "now-1y" } } } }
|
日期表示规则如下图示:
另外,也可以查询文档中某个字段值是否为空或者不存在该字段,如下分别是检索 ES 中存在 date 字段且值不为 null 和不存在 date 字段或者值为 null 的文档:
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
| // 检索出索引中存在 date 字段且值不为 null 的文档 POST products/_search { "query": { "constant_score": { "filter": { "exists": { "field": "date" } } } } } // 检索出索引中不存在 date 字段或值为 null 的文档 POST products/_search { "query": { "bool": { "must_not": { "exists": { "field": "date" } } } } }
|
需要说明的是,通过如下的 term 查询,仅是查询字段 genre 中包含文本 "Comedy"
的文档,而不是等于"Comedy"
的文档,具体如下:
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
| POST movies/_search { "query": { "term": { "genre.keyword": "Comedy" } } } // 响应 [ { "_id": "1", "_index": "movies", "_score": 1.2356555, "_source": { "@version": "1", "genre": [ "Adventure", "Animation", "Children", "Comedy", "Fantasy" ], "id": "1", "title": "Toy Story", "year": 1995 }, "_type": "_doc" }, { "_id": "5", "_index": "movies", "_score": 1.2356555, "_source": { "@version": "1", "genre": [ "Comedy" ], "id": "5", "title": "Father of the Bride Part II", "year": 1995 }, "_type": "_doc" } ]
|