ES 笔记十七:结构化搜索

结构化数据

  • 结构化搜索(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

ES 笔记十七:结构化搜索

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 查询
es
本作品采用《CC 协议》,转载必须注明作者和本文链接

快乐就是解决一个又一个的问题!

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!