1 DSL介绍
Elasticsearch提供了基于JSON的完整查询DSL(Domain Specific Language)来定义查询。
将查询DSL视为查询的AST(抽象语法树),它由两种子句组成:
-
叶子查询子句(Leaf query clauses)
在特定字段中查找特定值, 例如match,term或range查询 -
复合查询子句(Compound query clauses)
以逻辑方式组合多个叶子、复合查询为一个查询(例如bool或dis_max查询),
查询和过滤的区别
查询:用于检查内容与条件是否匹配,并且计算_score元字段表示匹配度。查询的结构中以query参数来开始执行内容的查询。
过滤:不计算匹配得分,只是简单的决定文档是否匹配。过滤往往会被elasticsearch自动缓存起来提高性能。
查询的子句中也可以传递filter参数。
2 数据准备
- 准备一个商品的索引
PUT goods
{
"mappings": {
"properties": {
"id":{
"type": "long"
},
"name":{
"type": "text",
"analyzer": "ik_max_word"
},
"category":{
"type": "keyword"
},
"price":{
"type": "float"
},
"content":{
"type": "text",
"analyzer": "ik_max_word"
},
"create_at":{
"type": "date",
"format": ["yyyy-MM-dd hh:mm:ss"]
}
}
}
}
- 插入数据
PUT goods/_doc/1
{
"id":1,
"name": "苹果手机12",
"category":"手机",
"price":8999.00,
"content":"Apple iPhone 12 Pro Max (A2412) 256GB 海蓝色 支持移动联通电信5G 双卡双待手机",
"create_at":"2020-12-12 12:00:00"
}
PUT goods/_doc/2
{
"id":2,
"name": "华为手机P40",
"category":"手机",
"price":7999.00,
"content":"华为p40 5G手机 亮黑色 8+128G全网通",
"create_at":"2020-12-11 12:00:00"
}
3 文本查询
基本语法
GET /索引库名/_search
{
"query":{
"查询类型":{
"查询条件":"查询条件值"
}
}
}
- 查询类型:
- 例如:
match_all,match,term,range等等
- 例如:
- 查询条件:查询条件会根据类型的不同,写法也有差异,后面详细讲解
3.1 match 查询
3.1.1 查询所有(match_all)
GET goods/_search
{
"query": {
"match_all": {
}}
}
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "goods",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"id" : 1,
"name" : "苹果手机12",
"category" : "手机",
"price" : 8999.0,
"content" : "Apple iPhone 12 Pro Max (A2412) 256GB 海蓝色 支持移动联通电信5G 双卡双待手机",
"create_at" : "2020-12-12 12:00:00"
}
},
{
"_index" : "goods",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"id" : 2,
"name" : "华为手机P40",
"category" : "手机",
"price" : 7999.0,
"content" : "华为p40 5G手机 亮黑色 8+128G全网通",
"create_at" : "2020-12-11 12:00:00"
}
}
]
}
}
可以不指定索引库:查询所有的索引库
GET _search
{
"query": {
"match_all": {
}}
}
3.1.2 match_none
这是match_all查询的逆函数,该查询不匹配任何文档
3.1.3 match query(匹配查询)
用于执行全文查询的标准查询,包括模糊匹配和短语或接近查询。
match类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是or的关系(默认)
or
GET goods/_search?
{
"query": {
"match": {
"content": {
"query": "华为手机",
"operator": "or" # 默认就是or
}
}
}
}
查询结果: 两条记录都查出来了
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 0.96994376,
"hits" : [
{
"_index" : "goods",
"_type" : "_doc",
"_id" : "2",
"_score" : 0.96994376,
"_source" : {
"id" : 2,
"name" : "华为手机P40",
"category" : "手机",
"price" : 7999.0,
"content" : "华为p40 5G手机 亮黑色 8+128G全网通",
"create_at" : "2020-12-11 12:00:00"
}
},
{
"_index" : "goods",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.16613919,
"_source" : {
"id" : 1,
"name" : "苹果手机12",
"category" : "手机",
"price" : 8999.0,
"content" : "Apple iPhone 12 Pro Max (A2412) 256GB 海蓝色 支持移动联通电信5G 双卡双待手机",
"create_at" : "2020-12-12 12:00:00"
}
}
]
}
}
- 华为手机,经过分词分为:华为,手机
- 搜索的时候,content字段中包含手机,或者华为这两个词就可以被匹配出来
and
GE

最低0.47元/天 解锁文章
591

被折叠的 条评论
为什么被折叠?



