es核心技术与实战 Day07(结构化)

结构化数据

  • 结构化搜索 (Structured search)是指对结构化数据的搜索
    • 日期,布尔类型和数字都是结构化的
  • 文本也可以是 结构化的。
    1. 如彩色笔可以有离散的颜色集合: 红(red) 、绿(green) 、蓝(blue)
    2. 一个博客可能被标记了标签,例如,分布式(distributed) 和搜索(search)
    3. 电商网站上的商品都有UPCs (通用产 品码Universal Product Codes)或其他的唯一
    4. 标识,它们都需要遵从严格规定的、结构化的格式。
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"}

//对布尔值match查询,有算分
//可以通过在 query 部分上方提供 “profile: true” 来启用Profile API
POST products/_search
{
  "profile": "true",
  "explain": true,
  "query": {
    "term": {
      "avaliable": true
    }
  }
}

//跳过了算分的步骤
POST products/_search
{
  "profile": "true",
  "explain": true,
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "avaliable": true
        }
      }
    }
  }
}


GET products/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "price": {
            "gte": 20,
            "lte": 30
          }
        }
      }
    }
  }
}

GET products/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "date": {
            "gte": "now-1y"
          }
        }
      }
    }
  }
}

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"]

}

Profile API响应说明:

上面的响应显示的是单个分片。每个分片都被分配一个唯一的ID,ID的格式是[nodeID][indexName][shardID]。现在在"shards"数组里还有另外三个元素,它们是:

  • query
    Query 段由构成Query的元素以及它们的时间信息组成
  • rewrrite_time
    Rewrite Time
    由于多个关键字会分解以创建个别查询,所以在这个过程中肯定会花费一些时间。将查询重写一个或多个组合查询的时间被称为“重写时间”。(以纳秒为单位)。
  • collector
    Collectors
    在Lucene中,收集器是负责收集原始结果,收集和组合结果,执行结果排序等的过程。例如,在上面的执行的查询中,当查询语句中给出size:0时,使用的收集器是"totalHitCountCollector"。这只返回搜索结果的数量(search_count),不返回文档。此外,收集者所用的时间也一起给出了。
    参考链接
日期Range

es核心技术与实战 Day07(结构化)_第1张图片

相关性和相关性算分

  • 相关性 一Relevance
    • 搜索的相关性算分,描述了一个文档和查询语句匹配的程度。ES会对每个匹配查询条件的结果进行算分_score
    • 打分的本质是排序,需要把最符合用户需求的文档排在前面。ES 5之前,默认的相关性算分采用TF-IDF,现在采用BM 25

词频TF
Term Frequency: 检索词在子篇文档中出现的频率
检索词出现的次数除以文档的总字数
度量一条查询和结果文档相关性的简单方法: 简单将搜索中每一一个词的TF进行相力
TF(区块链) + TF(的) + TF(应用)
Stop Word“的”在文档中出现了很多次,但是对贡献相关度几乎没有用处,不应该考虑他们的TF

DF
DF:检索词在所有文档中出现的频率

  • “区块链”在相对比较少的文档中出现
  • “应用”在相对比较多的文档中出现
  • “Stop Word"在大量的文档中出现
    Inverse Document Frequency :简单说= log(全部文档数/检索词出现过的文档总数)
    TF-IDF本质上就是将TF求和变成了加权求和

Boosting 是控制相关度的一种手段
索引,字段或查询子条件

  • 参数 boost的含义
    • 当boost> 1时,打分的相关度相对性提升
    • 当0< boost< 1时,打分的权重相对性降低
    • 当 boost<0时,贡献负分

在Elasticsearch中,有QueryFilter 两种不同的Context

  • Query Context:相关性算分
  • Filter Context:不需要算分( Yes or No)可以利用Cache,获得 更好的性能

bool查询
一个bool查询,是一个或者多个查询子句的组合

  • 总共包括4种子句。其中2种会影响算分,2种不影响算分
    相关性并不只是全文本检索的专利。也适用于yes | no的子句,匹配的子句越多,相关性评分越高。如果多条查询子句被合并为一条复合查询语句,比如bool查询,则每个查询子句计算得出的评分会被合并到总的相关性评分中。
must 必须匹配。贡献算分
should 选择性匹配。贡献算分
must_ _not Filter Context查询字句,必须不能匹配
filter Filter Context必须匹配,但是不贡献算分
POST /products/_search
{
  "query": {
    "bool" : {
      "must" : {
        "term" : { "price" : "30" }
      },
     "filter": {
        "term" : { "avaliable" : "true" }
     },
     "must_ not" : {
       "range" : {
         "price" : { "lte": 10 }
     },
      "should" : [
        { "term" : { "productID.keyword" : "JODL-X-1937-#pV7"} },
        { "term" : { "productID.keyword" : "XHDK-A-1293-#fJ3"} }
      ],
      "minimum_should_match" :1
   }
  }
}

你可能感兴趣的:(elasticsearch)