我想知道是否有一种方法可以知道solr响应中的第一个结果是否与我的查询完全匹配?例如,我正在搜索包含以下词语的文档:“iPhone 6s 64 GB黄金”
我得到了3个结果:
1)包含单词“iphone 6s 64GB
“的第一个结果,得分为:187.86491
2)第二个结果包含单词“iphone 6s
“,得分为:170.36568
3)第三个结果包含单词“iphone
“,得分为:136.68152
当我归一化分数时,我得到了这些新分数:
1) score 1.0
2) score 0.92
3) score 0.66
这里的问题是第一个结果得到的分数是1.0(仅仅因为它是第一个具有较高solr分数的结果,但它不能证明它是精确匹配),而在我看来,它应该是~0.5,因为它不是精确匹配。我想知道我得到的结果是否真的相关,并只取“最相关”的结果-例如:只有得分大于0.6的结果,但是我现在不能做,因为0.6不能证明真实的的相关性。
3条答案
按热度按时间laik7k3q1#
没有所谓的“真实的的相关性”,这就是为什么最高分没有被标准化为1.0的原因。根据您给予Solr的参数,可以认为事情或多或少是相关的(例如如何对各个字段进行评分)。在此上下文中,“60%相关性”* 真正 * 意味着什么?查询之间的评分是(通常)不可比,并且将根据索引的内容而改变(如果索引具有相同术语的新文档,则如果再次运行,则先前查询的分数可能降低)。
如果你想对精确匹配进行优先级排序,可以添加一个带有KeywordTokenizer和LowercaseField的字段,并给该字段打更高的分(通过qf=);如果大小写很重要,可以使用StrField(它只会给你提供完美的 * 精确 * 匹配),并给该字段打更高的分。
如果你想“要求”所有搜索项都存在,使用
q.op=AND
,如果所有字段都不存在,它不会给予任何匹配结果;如果你想进行更高级的匹配,使用mm
参数来精确地说明需要匹配多少个搜索项(你可以用百分比、间隔等来表示)。当您使用dismax或edismax查询处理程序时,这些设置是相关的,听起来就像您在问题中所做的那样。
p1tboqfb2#
为了完成您的要求(不考虑您为什么要这样做),您可以:
1.使用highlighting返回文档中匹配的内容
1.将查询字符串与突出显示的片段进行比较,并验证它是否完全匹配
注意事项:
1.如果您使用词干分析器等,精确匹配可能意味着仅匹配部分术语。因此,您不能仅使用字符串比较,您需要首先通过每个分析链运行查询字符串和片段(通过查询分析运行查询字符串,通过索引分析运行片段)
1.根据高亮显示类型,您可能需要在字段中使用某些功能。
jjjwad0x3#
其他的回答也有道理(我投了赞成票),但我想再加一些颜色。
不要试图从分数值推断文档的细节(至少不要使用任何基于标准TF/IDF或BM 25的相似性类)。这些分数告诉您的唯一事情是,假设评分模型的假设是正确的,哪个文档可能是相关的。
这些模型通常假设“稀有”词比普通词更重要(通常“黄金”比“制造”或“的”更重要,因为许多东西都是制造的,“的“这个词很可能出现在几乎每一份文件中,但黄金的东西很少...),并且较高比例的词匹配查询的文档比具有较少匹配的文档更重要。(即,150字文档中的12个匹配可能比50000字文档中的14个匹配更相关)
“罕见”是通过查看索引中的文档来估计的(系统无法知道任何未编入索引的文档)。因此,每次将任何文档添加到索引时,文档的得分都会发生变化。
1.新文档包含查询中您关心的一个术语,或者
1.新文档不包含查询中您所关心的任何一个词。
在第一种情况下,文档的比例上升(分子和分母都是+1,所以如果2个中有1个之前是,现在3个中有2个现在这样做了)。在第二种情况下,文档的数量增加,而所占比例下降(2中的1变为3中的1)。因此,在情况#1中,每个先前匹配文档的得分下降,而在情况#2每个先前匹配的文档的得分上升(得分与文档频率的倒数成比例:即1/IDF,BM 25更复杂但相似)
大多数情况下,人们似乎是在犯了将文档分数打印在用户看到的结果中的战术错误之后才问这类问题的。用户不是信息检索Maven,不知道这个数字意味着什么。用户通常会抱怨,因为他们猜测了它是如何工作的,然后发现他们的猜测是错误的。不要向用户显示分数。即使你把它“标准化”。分数只会把他们搞糊涂。
如果您确实需要确保只得到所有搜索项匹配的结果,那么您可以设置
q.op=AND
,但这会冒用户得到完全空的搜索结果的巨大风险。(有一些情况,但很少见),如果没有结果,用户可能不会购买任何东西,而如果你给他们看的话,他们可能会买下次好的东西。如果您使用同义词进行词干处理,或者在分析期间修改令牌的其他情况下,您仍然可能会得到看起来像错误匹配的内容。“golden”和“gold”很可能都被词干处理为“gold”,因此,使用词干处理,您对“iphone6 s64 GB gold”的查询也会匹配带有文本“golden opportunity to win a free case for galaxy note 9”的文档。
分数是用来根据相关性排序的,对其他任何事情都没有好处。
最后,有一种方法可以从调试output中获取有关匹配项的信息,但是强制solr返回该输出代价很高,可能会导致不可接受的查询响应时间和为查询响应传输的数据大小的大幅增加,这是最后的选择,因为代价太高了。很少有用例能够从解析这个输出中获得足够的价值来支付产生它的成本。该输出用于调试,并且比响应的其余部分更可能在SOLR版本之间改变(如果没有别的,就反映新功能),这可能会让升级变得痛苦。