Lucene:如何在第一场比赛后停止搜索当前文档

时间:2012-01-06 09:10:24

标签: java lucene

标题可能有些含糊不清,但请耐心等待(我能找到的唯一类似问题是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可以包含automobilevehicle等字符串。可以有多个{文档中的{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) 中的(更重要的)匹配后如何停止在当前文档中搜索?

2 个答案:

答案 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排名更高。