结构化搜索
# 一、结构化数据
结构化搜索是针对结构化数据的搜索:
- 日期、布尔类型、数字都是结构化的
- 颜色集合(红、绿、蓝)也属于结构化数据
- 一个文章可能会被打上标签
# 二、ES的结构化搜索
布尔、时间、日期和数字这些结构化数据如果有精确的格式,我们就可以直接对这些格式进行逻辑操作。
结构化的文本可以做精确匹配或者部分匹配
- term实现精确匹配。
- Prefix实现前缀匹配。
- ...
结构化只有是和否的结果,也可以根据场景需要,决定是否打分。
# 三、案例实践
数据准备
#结构化搜索,精确匹配
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" }
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
}
}
}
}
}
}
}
布尔查询(算分)
POST products/_search
{
"query": {
"term": {
"avaliable": true
}
}
}
布尔查询(不算分)
POST products/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"avaliable": true
}
}
}
}
}
数字类型查询(算分)
#数字类型 Term
POST products/_search
{
"query": {
"term": {
"price": 30
}
}
}
数字类型查询(不算分)
#数字类型 terms 查询价格为20或者30的商品
POST products/_search
{
"query": {
"constant_score": {
"filter": {
"terms": {
"price": [
"20",
"30"
]
}
}
}
}
}
范围查询
#数字 Range 查询
GET products/_search
{
"query" : {
"constant_score" : {
"filter" : {
"range" : {
"price" : {
"gte" : 20,
"lte" : 30
}
}
}
}
}
}
# 日期 range 查询一年前的
POST products/_search
{
"query" : {
"constant_score" : {
"filter" : {
"range" : {
"date" : {
"gte" : "now-1y"
}
}
}
}
}
}
是否存在某个字段查询
#exists查询 查询date字段不为空的数据
POST products/_search
{
"query": {
"constant_score": {
"filter": {
"exists": {
"field": "date"
}
}
}
}
}
# 参考
上次更新: 2024/06/29, 15:13:44