标题可能有些含糊不清,但请耐心等待(我能找到的唯一类似问题是Solr: Search in multiple fields BUT STOP if documents match was found,但这并没有提供任何解决方案)。我的lucene文档有以下结构:
FieldA (Store.YES, Index.ANALYZED), primary identification of an entity
FieldB (Store.YES, Index.ANALYZED), secondary identification(s) of an entity
FieldA
可以包含类似car
的字符串,其中FieldB
可以包含automobile
,vehicle
等字符串。可以有多个{文档中的{1}}个字段。索引分析器是FieldB
,搜索分析器是StandardAnalyzer
(似乎产生了最好的结果,不确定它是否是最好的方法)。 KeywordAnalyzer
中的标识符比FieldA
中的标识符更重要。
假设索引包含3个文档(带FieldB
个字段):
FieldA | FieldB
到目前为止,这么好。现在问题所在:
查询"car" | "vehicle" "automobile"
"car parts" | "parts, car"
"car shop" | "shop, car"
时,我希望看到以下结果(得分):
"car"
car, score 1.0
car parts, score 0.9
car shop, score 0.9
值为" car"的文档应首先显示,因为FieldA
被认为更重要,并且查询最符合该值。实际上,会发生以下情况:
FieldA
car parts, score 0.625
car shop, score 0.625
car, score 0.5073969
输出以下信息:(左边是#34的解释;车间" out,因为它与&#34相同;汽车零件")
searcher.explain()
TL; DR:在两个领域,提升FieldA将无济于事,因为所有3个文件都会得到提升。如何让lucene将最接近的匹配("汽车"在这个例子中#34;)排在最高位置?即在遇到Explain: 0.625 = (MATCH) max of:
0.31712303 = (MATCH) weight(fielda:car in 0), product of:
0.71231794 = queryWeight(fielda:car), product of:
0.71231794 = idf(docFreq=3, maxDocs=3)
1.0 = queryNorm
0.4451987 = (MATCH) fieldWeight(fielda:car in 0), product of:
1.0 = tf(termFreq(fielda:car)=1)
0.71231794 = idf(docFreq=3, maxDocs=3)
0.625 = fieldNorm(field=fielda, doc=0)
0.625 = (MATCH) fieldWeight(fieldb:car in 0), product of:
1.0 = tf(termFreq(fieldb:car)=1)
1.0 = idf(docFreq=2, maxDocs=3)
0.625 = fieldNorm(field=fieldb, doc=0)
Explain: 0.5073969 = (MATCH) max of:
0.5073969 = (MATCH) weight(fielda:car in 0), product of:
0.71231794 = queryWeight(fielda:car), product of:
0.71231794 = idf(docFreq=3, maxDocs=3)
1.0 = queryNorm
0.71231794 = (MATCH) fieldWeight(fielda:car in 0), product of:
1.0 = tf(termFreq(fielda:car)=1)
0.71231794 = idf(docFreq=3, maxDocs=3)
1.0 = fieldNorm(field=fielda, doc=0)
中的(更重要的)匹配后如何停止在当前文档中搜索?
答案 0 :(得分:0)
使用NOT语法。
a:car^2 (+b:car -a:car)
这样,在b中匹配的匹配将被忽略,除非它们不匹配。
答案 1 :(得分:0)
问题在于, fieldb 汽车只能在三个术语中的两个中找到,而在 fielda 中,汽车可以在所有三个术语中找到。所以匹配赛车中的赛车得分更高,因为它有更高的idf(1.0与0.7123174相比)
匹配的价值主要是:
idf * idf * fieldnorm * tf
其中fieldnorm是
lengthnorm * fieldboost
所以你可以看到idf非常重要。
实际上如果你确实提升了一个可行的字段,因为与fieldb上的匹配相比,字段a上的匹配会变得更快,而在你的例子中,它匹配的fieldb排名更高。