分析match 查询(explanation)
curl -XGET 'http:
//localhost:9200/test/article/_validate/query?explain&explanation&pretty' -d '
{
"query": {
"match": {
"content":
"更新"
}
}
}'
#返回
{
"valid" :
true,
"_shards" : {
"total" :
1,
"successful" :
1,
"failed" :
0
},
"explanations" : [ {
"index" :
"test",
"valid" :
true,
"explanation" :
"+(content:更 content:新) #ConstantScore(+ConstantScore(_type:article))"
} ]
}
explanations 中描述了 ES 将 “更新” 拆成 “更”、”新” 来查找
5、排序
默认情况下,结果集以 _score(相关性评分) 进行倒序排列(值越高越靠前)
可以使用 sort 指定排序字段
查询 内容中包含 “第二更新” 的文档,并按照 id 倒序排列
curl -XGET 'http:
//localhost:9200/test/article/_search?pretty' -d '
{
"query": {
"match": {
"content":
"第二更新"
}
},
"sort": {
"id": {
"order":
"desc"
}
}
}'
#返回
{
"took" :
96,
"timed_out" :
false,
"_shards" : {
"total" :
5,
"successful" :
5,
"failed" :
0
},
"hits" : {
"total" :
3,
"max_score" :
null,
"hits" : [ {
"_index" :
"test",
"_type" :
"article",
"_id" :
"4",
"_score" :
null,
"_source" : {
"id" :
4,
"subject" :
"第四篇文章标题",
"content" :
"第四篇文章内容-更新后",
"author" :
"tomi"
},
"sort" : [
4 ]
}, {
"_index" :
"test",
"_type" :
"article",
"_id" :
"3",
"_score" :
null,
"_source" : {
"id" :
3,
"subject" :
"第三篇文章标题",
"content" :
"第三篇文章内容",
"author" :
"jam"
},
"sort" : [
3 ]
}, {
"_index" :
"test",
"_type" :
"article",
"_id" :
"AVf_6fM1vEkwGPLuUJqp",
"_score" :
null,
"_source" : {
"id" :
2,
"subject" :
"第二篇文章标题",
"content" :
"第二篇文章内容",
"author" :
"jam"
},
"sort" : [
2 ]
} ]
}
}
每个结果中多了个 sort 字段,就是以此来排序的,而 _score 的值为 null ,是因为计算 _score 是比较消耗性能的,而它通常主要用作排序,既然已经指定排序字段了,就不会计算 _score ,若要强制计算 _score ,可加入如下内容(与 query ,sort 同级)
"track_scores" :
true
多级排序
按照 _score 倒序排序,若分数相同,再按照 id 倒序排序;因为使用了 _score 排序,所以会计算出 _score ,而不需要使用 “track_scores” : true
curl -XGET
'https://localhost:9200/test/article/_search?pretty' -d
'
{
"query": {
"match": {
"content": "第二更新"
}
},
"sort": [
{ "_score": { "order": "desc" }},
{ "id": { "order": "desc" }}
]
}'
#返回
...
"sort" : [
0.05846126,
4 ]
...
"sort" : [
0.023869118,
2 ]
...
"sort" : [
0.0050183414,
3 ]
...
这里简单介绍一下 _score 相关性评分值是如何得来的,这就涉及到了 ElasticSearch 的相似度算法( TF/IDF),即检索词频率/反向文档频率,它包括
检索词频率:检索词在该字段出现的频率,出现频率越高,相关性也越高
反向文档频率:一个词在所有文档中出现的频率,出现的越频繁,分数越低,因为像 “的” “我” 这类字出现得很频繁,对相关性贡献很低,相反,如 “ElasticSearch” 这类少见的词对相关性贡献很大,分数也就会越高
字段长度:字段越短,其权重就越高。检索词出现在一个较短的字段中比出现在一个较长的字段中所占的权重越高
参考文档