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