ElasticSearch之结构化搜索

写在前面

本文看下es的结构化搜索,结构化搜索顾名思义就是对结构化数据的搜索,那么什么是结构话数据呢?我的理解是具有一定规则的数据就是结构化,在es中包括但不限于如下:

复制代码
1:Boolean
    只有true和false
2:整数
    就是整数,不会是其他的
3:日期
    日期的格式虽然可能有多种,但也是有规则的
4:枚举类的text
    普通的text肯定不是结构化数据,比如一条日志,但是如性别,风险等级,彩笔的颜色等,都是有限的枚举值,所以也是结构化的数据
5:文档的key
    是有限的枚举值,所以也是有规则的,所以也是结构化数据。

针对上述数据的搜索,我们可以采用term搜索 以及前缀搜索 等词项查询 。

结构化查询在一定程度上可以认为是精准匹配,所以可以根据具体情况考虑不算分 。

1:例子

1.1:布尔,数字

复制代码
# 1:删除老的,避免影响
DELETE /products
POST /products/_bulk
{"index": {"_id": 1}}
{"price":10,"available":true,"date":"2018-01-01","productID":"XHDK-A-1293-#fJ3"}
{"index": {"_id": 2}}
{"price":20,"available":true,"date":"2019-01-01","productID":"KDKE-B-9947-#kL5"}
{"index": {"_id": 3}}
{"price":30,"available":true,"productID":"JODL-X-1937-#pV7"}
{"index": {"_id": 4}}
{"price":30,"available":false,"productID":"QQPX-R-3956-#aD8"}

# 2:对布尔查询,并且算分,可以查询到3条
POST products/_search
{
  "profile": "true",
  "explain": true,
  "query": {
    "term": {
      "available": true
    }
  }
}
# 3:对布尔查询,不算分,可以查询到3条
POST products/_search
{
    "profile": "true",
    "explain": true,
    "query": {
        "constant_score": {
            "filter": {
                "term": {
                    "available": true
                }
            }
        }
    }
}

# 4:数字range
POST products/_search
{
    "query": {
        "constant_score": {
            "filter": {
                "range": {
                    "price": {
                        "gte": 20,
                        "lte": 30
                    }
                }
            }
        }
    }
}

1.2:日期

复制代码
# 1:删除老的,避免影响
DELETE /products
POST /products/_bulk
{"index": {"_id": 1}}
{"price":10,"available":true,"date":"2018-01-01","productID":"XHDK-A-1293-#fJ3"}
{"index": {"_id": 2}}
{"price":20,"available":true,"date":"2019-01-01","productID":"KDKE-B-9947-#kL5"}
{"index": {"_id": 3}}
{"price":30,"available":true,"productID":"JODL-X-1937-#pV7"}
{"index": {"_id": 4}}
{"price":30,"available":false,"productID":"QQPX-R-3956-#aD8"}

# 2:日期range
POST products/_search
{
    "query": {
        "constant_score": {
            "filter": {
                "range": {
                    "date": {
                        "gte": "now-7y"
                    }
                }
            }
        }
    }
}

日期的语法糖:

1.3:Exist

复制代码
# 1:删除老的,避免影响
DELETE /products
POST /products/_bulk
{"index": {"_id": 1}}
{"price":10,"available":true,"date":"2018-01-01","productID":"XHDK-A-1293-#fJ3"}
{"index": {"_id": 2}}
{"price":20,"available":true,"date":"2019-01-01","productID":"KDKE-B-9947-#kL5"}
{"index": {"_id": 3}}
{"price":30,"available":true,"productID":"JODL-X-1937-#pV7"}
{"index": {"_id": 4}}
{"price":30,"available":false,"productID":"QQPX-R-3956-#aD8"}

# 2:exists,必须包含date key并且有值才行(null和空字符串都不可以)
POST products/_search
{
    "query": {
        "constant_score": {
            "filter": {
                "exists": {
                    "field": "date"
                }
            }
        }
    }
}

1.4:多值字段

复制代码
# 1:删除老的,避免影响
DELETE movies
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"]}

# 2:会查询出{"_id": 2}的数据,它是个数组,其实不应该查出来
POST movies/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "genre.keyword": "Comedy"
        }
      }
    }
  }
}

上述的查询,将"_id": 2}的数据的数据也查询出来了,其实这是不对的,是es对数组的实现机制导致了这个问题,该怎么办呢?

写在后面

其实结构化搜索的内容是包含在我们前面学习过的这篇文章 中的,只不过这里为了更加明确结构化的概念又进行了专门的的分析。

参考文章列表

ElasticSearch之search API

相关推荐
ofoxcoding13 小时前
借助 CLAUDE.md 约束 Sonnet 5.5 多文件重构行为的提示词实践
大数据·elasticsearch·ai·重构
Elasticsearch13 小时前
隆重推出 AlertZero:让你的告警队列实现 “收件箱清零” 式管理
elasticsearch
ly768913 小时前
从 TF-IDF 到 BM25:Elasticsearch 相关性评分的字段长度归一化与 boost 调参边界
java·elasticsearch·query dsl·bm25·相关性评分
SL-staff14 小时前
技术实践:将Excel自动升级为可搜索的知识节点(JVS平台实现)
mongodb·elasticsearch·知识图谱·jvs平台·语义解析·企业文档管理·excel结构化
Elasticsearch14 小时前
2026 年唯一获得端点预防与响应(EPR)满分的厂商是 Elastic
elasticsearch
vx_Biye_Design14 小时前
springboot旅游管理系统18006-计算机课程设计、毕业设计
java·spring boot·后端·python·elasticsearch·django·课程设计
ly76891 天前
倒排索引与 FST 在 Lucene 中的内存布局:segment、docValues 与词典压缩的工程取舍
elasticsearch·lucene·倒排索引·doc values·fst
Elasticsearch1 天前
利用预计算上下文,更快速、更低成本地开展支持问题调查
elasticsearch
小小小米粒1 天前
重置本地git
大数据·git·elasticsearch
ly76891 天前
Spring Boot 集成 Elasticsearch 的生产实践:客户端选型、索引生命周期与批量写入容错
spring boot·elasticsearch·索引生命周期·java api client·批量写入