ElasticSearch会对用户输入的关键字然后去对文章做一个打分的,除非你用的是filter,filter的方式是不会打分的,如果你用的不是filter的方式,那么ElasticSearch会进行打分,
打分的流程原理:
1.boolean model根据用户的query条件,先过滤出包含指定term的doc ,此步骤是不会对文章进行打分的,
2.relevance score算法,计算匹配度的
简单来说,就是计算出,一个索引中的文本,与搜索文本,他们之间的关联匹配程度
1)boolean model
根据用户的query条件,先过滤出包含指定term的doc
query “hello world” —> hello / world / hello & world
bool —> must/must not/should —> 过滤 —> 包含 / 不包含 / 可能包含
doc —> 不打分数 —> 正或反 true or false —> 为了减少后续要计算的doc的数量,提升性能
2)relevance score算法
,简单来说,就是计算出,一个索引中的文本,与搜索文本,他们之间的关联匹配程度
Elasticsearch使用的是 term frequency/inverse document frequency算法,简称为TF/IDF算法
注意 TF/IDF的意思是TF分数除以IDF
Term frequency:搜索文本中的各个词条在field文本中出现了多少次,出现次数越多,就越相关
假如说输入关键字:hello world
然后开始搜索文档:
doc1:hello you, and world is very good
doc2:hello, how are you
最后doc1 出现了2次,doc2出现了1次 ,关键字在文档中出现的次数越多,TF就会越高.
注意TF是针对单个文档的
Inverse document frequency:搜索文本中的各个词条在整个索引的所有文档中出现了多少次,出现的次数越多,就越不相关.
注意IDF针对的是整个索引库的文档
假如说我输入一个关键字是:hello world
doc1:hello, tuling is very good
doc2:hi world, how are you
比如说,在index中有1万条document,hello这个单词在所有的document中,一共出现了1000次;world这个单词在所有的document中,一共出现了100次 ,按照 TF/IDF算法来讲,是doc2的分数更高.因为还会考虑到
Field-length norm:field长度,field越长,相关度越弱
假如说用户输入关键字:hello world
doc1:{ “title”: “hello article”, “content”: “100个单词” }
doc2:{ “title”: “my article”, “content”: “100个单词,hi world” }
hello world在整个index中出现的次数是一样多的 ,doc1更相关,为什么呢?因为doc1的title字段只有两个单词,就匹配上了输入的关键字,而doc2里,conten里面有100个单词才匹配上了输入的关键字 ,
说明doc1更相关
2、分析一个document上的_score是如何被计算出来的
GET /es_db/_doc/1/_explain
{
“query”: {
“match”: {
“remark”: “java developer”
}
}
}