搜索精准度

搜索精准度

关键字加入分词器后 完整的搜索关键字为啥搜不到?

Elasticsearchlengchanguo 回复了问题 • 5 人关注 • 5 个回复 • 622 次浏览 • 2017-12-06 19:08 • 来自相关话题

每个商品会有描述,切成一组关键词,用户输入多个关键词,当商品的所有关键词在用户的关键词,将被检索出来

Elasticsearchnovia 回复了问题 • 2 人关注 • 1 个回复 • 379 次浏览 • 2017-11-24 16:39 • 来自相关话题

es如何让含有输入关键字的越多的排在前面

Elasticsearch匿名用户 回复了问题 • 4 人关注 • 5 个回复 • 628 次浏览 • 2017-09-20 14:31 • 来自相关话题

条新动态, 点击查看
这个问题比较有趣!  
 
默认的打分机制参考tf, idf,和field norms, 根据给的示例数据看,"柠檬“这个词对于3条文档的tf, idf应该一样,影响打分的只有filed norms。 按道理“柠檬”的field length最短,那... 显示全部 »
这个问题比较有趣!  
 
默认的打分机制参考tf, idf,和field norms, 根据给的示例数据看,"柠檬“这个词对于3条文档的tf, idf应该一样,影响打分的只有filed norms。 按道理“柠檬”的field length最短,那么得分应该最高,排在第一位返回才对。  
 
为了验证这个结果,我实际测试了一下,过程如下:
 
创建一个空索引,使用ik_max_word分词器并写入3条数据 PUT testindex/
{
"mappings": {
"logs": {
"properties": {
"product": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}


PUT testindex/logs/1
{"product":"柠檬"}

PUT testindex/logs/2
{"product":"柠檬汽水"}

PUT testindex/logs/3
{"product":"柠檬味牙膏"}










 
查询关键词"柠檬" POST testindex/_search
{
"query": {
"match": {
"product": "柠檬"
}
}
}
查询结果:[code]"hits": {
"total": 3,
"max_score": 0.85747814,
"hits":
}

"柠檬"居然真分数最低,非常出乎我的意料。
 
于是,我在查询里打开"explain":true选项,查看分数是怎么计算的,发现doc frequency, avgfieldlength看着都不对。 
 
百思不得其解的情况下,Google了一下,在这里找到了答案:
https://github.com/elastic/elasticsearch/issues/24429
 
简而言之,ES的相关性打分计算是每个shard独立做的。一个索引默认5个shard,如果象示例里那样,写入的文档比较少,可能这些文档分布在不同的shard,造成各个shard分别计算各自的得分的时候,并没有将这几条文档放在一起产生统计数据。 各自的打分不具有可比性。
 
所以,后面我又做了一个测试,删掉这个索引,重新创建一个,将shard设置为1,重新写入同样3条文档后再搜索,"柠檬”是排第一位返回的。
 
那么怎么看待这个问题?  因为ES是分布式搜索系统,各个shard独立搜索,独立计算该shard上的文档打分,当数据量比较大的情况下, 上面说的差异统计上看基本被抹平了,通常没什么问题。  但如果索引的文档比较少,不同shard之间对同一个搜索关键词的统计数据差异可能就比较大,这种情况下只能使用一个shard来解决了。

关键字加入分词器后 完整的搜索关键字为啥搜不到?

回复

Elasticsearchlengchanguo 回复了问题 • 5 人关注 • 5 个回复 • 622 次浏览 • 2017-12-06 19:08 • 来自相关话题

每个商品会有描述,切成一组关键词,用户输入多个关键词,当商品的所有关键词在用户的关键词,将被检索出来

回复

Elasticsearchnovia 回复了问题 • 2 人关注 • 1 个回复 • 379 次浏览 • 2017-11-24 16:39 • 来自相关话题

es如何让含有输入关键字的越多的排在前面

回复

Elasticsearch匿名用户 回复了问题 • 4 人关注 • 5 个回复 • 628 次浏览 • 2017-09-20 14:31 • 来自相关话题