笔记十八:结构化搜索
结构化数据#
- 结构化搜索(Structured search) 是指对结构化数据的搜索
- 日期,布尔类型和数字都是结构化
- 文本也可以是结构化的
- 如彩色笔可以有离散的颜色集合:红(red)、绿(green)、蓝(blue)
- 一个博客可能被标记了标签,例如,分布式(distributed)和搜索(search)
- 电商网站上的商品都有 UPCs(通用产品码 Universal Product Codes)或其他的唯一标识,它们都遵从严格规定的、结构化的格式
ES 中的机构化搜索#
- 布尔、时间,日期和数字这类结构化数据:有精确的格式,我们可以对这些格式进行逻辑操作。包括比较数字或时间的范围,或判断两个值的大小
- 结构化的文本可以做到精确匹配或者部分匹配
- Term 查询 / Prefix 前缀查询
- 结构化结构只有 “是” 或 “否” 两个值
- 根据场景需要,可以决定结构化搜索是否需要打分
Demo#
DELETE products
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"}
#查看mapping
GET products/_mapping
{
"products" : {
"mappings" : {
"properties" : {
"avaliable" : {
"type" : "boolean"
},
"date" : {
"type" : "date"
},
"price" : {
"type" : "long"
},
"productID" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
对布尔值 match 查询,有算分#
POST products/_search
{
"profile": "true",
"explain": true,
"query": {
"term": {
"avaliable": true
}
}
}
对布尔值,通过 constant score 转成 filtering,没有算分#
POST products/_search
{
"profile": "true",
"explain": true,
"query": {
"constant_score": {
"filter": {
"term": {
"avaliable": true
}
},
"boost": 1.2
}
}
}
数字类型 Term#
POST products/_search
{
"profile": "true",
"explain": true,
"query": {
"constant_score": {
"filter": {
"term": {
"price": 30
}
},
"boost": 1.2
}
}
}
数字类型 terms#
POST products/_search
{
"profile": "true",
"explain": true,
"query": {
"constant_score": {
"filter": {
"terms": {
"price": [
"20",
"30"
]
}
}
}
}
}
数字 Range 查询#
POST products/_search
{
"profile": "true",
"explain": true,
"query": {
"constant_score": {
"filter": {
"range": {
"price": {
"gte": 20,
"lte":30
}
}
}
}
}
}
- gt 大于
- lt 小于
- gte 大于等于
- lte 小于等于
日期 range#
POST products/_search { "query": { "constant_score": { "filter": { "range": { "date": { "gte": "now-1y" //当前时间减1天 } } } } } }
- Date Match Expressions
- 2014-01-01 00:00:00 || +1M
exists 查询 - 非空查询#
POST products/_search
{
"query" : {
"constant_score" : {
"filter" : {
"exists": {
"field":"date"
}
}
}
}
}
字符类型 terms#
POST products/_search
{
"query": {
"constant_score": {
"filter": {
"terms": {
"productID.keyword": [
"QQPX-R-3956-#aD8",
"JODL-X-1937-#pV7"
]
}
}
}
}
}
处理多值字段#
#demo
POST /movies/_bulk
{"index":{"_id":1}}
{"title":"Father of the Bridge Part II","year":1995,"genre":"Comedy"}
{"index":{"_id":2}}
{"title":"Dave","year":1993,"genre":["Comedy","Romance"]}
处理多值字段,term 查询是包含,而不是等于#
//返回2条数据
POST movies/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"genre.keyword": "Comedy"
}
}
}
}
}
Match 跟 term 对比#
POST products/_search
{
"profile": "true",
"explain": true,
"query": {
"term": {
"date": "2019-01-01"
}
}
}
POST products/_search
{
"profile": "true",
"explain": true,
"query": {
"match": {
"date": "2019-01-01"
}
}
}
本节知识点回顾#
- 机构化数据 & 结构化搜索
- 如果不需要算分,可以通过 Constant Score ,将查询转为 Filterng
- 范围查询 和 Date Match
- 使用 Exist 查询处理非空 NULL 值
- 精确值 & 多值字段的精确值查找
- Term 查询是包含,不是完全相等。针对多值字段查询要尤其注意
备注#
- 什么时候用 term 跟 match
- 结构化数据的精确匹配,就使用 term 查询。日期属于结构化数据。match 主要用于文本的 full-text 查询
本作品采用《CC 协议》,转载必须注明作者和本文链接