9

我有两个文档并使用 Luke 进行调查,我已经在代码中确认它具有相同的行为,使用StandardAnalyzer.

用 boost 1 记录一个

stored/uncompressed,indexed,tokenized<Description:Nummer ett>
stored/uncompressed,indexed,tokenized<Id:2>
stored/uncompressed,indexed,tokenized<Name:Apa>

用 boost 2 记录两个

stored/uncompressed,indexed,tokenized<Description:Nummer två>
stored/uncompressed,indexed,tokenized<Id:1>
stored/uncompressed,indexed,tokenized<Name:Apa>

在字段名称中搜索 apa 使用 boost 并以正确的顺序返回。

Document 2 has Score 1,1891
Document 1 has Score 0.5945

搜索 ap* 返回无序和相同的分数

Document 1 Score 1.0000
Document 2 Score 1.0000

搜索 apa* 返回不分先后,分数相同

Document 1 Score 1.0000
Document 2 Score 1.0000

为什么是这样?即使必须使用通配符,我也想返回一些具有更高提升值的文档。这可能吗?

为所有很酷的编码员干杯!

这就是我想要的共犯。

搜索字符串和想要的匹配项。使用通配符。搜索“鲁”+“*”

Document
 Name
 City

例如,我希望名称为 Lund 的文档比名称为 Lunt 或 City is Lund 的文档获得更高的评级。这是因为我会知道哪些文件最受欢迎。我想获得带有斯德哥尔摩城市和名称斯德哥尔摩和斯德哥尔摩的文件,但按我的选择订购。

4

1 回答 1

10

因为WildcardQuery是你的一个子类,MultiTermQuery你的分数恒定为 1。

如果您检查 的定义t.getBoost()

t.getBoost() 是查询文本中指定的查询 q 中术语 t 的搜索时间提升(参见查询语法),或者由应用程序调用 setBoost() 设置。请注意,实际上没有直接的 API 用于访问多词查询中的一个词的提升,而是多个词在查询中表示为多个 TermQuery 对象,因此查询中的词的提升可以通过调用子查询 getBoost()

http://lucene.apache.org/core/old_versioned_docs/versions/3_0_1/api/core/org/apache/lucene/search/Similarity.html#formula_termBoost

一种可能的技巧是设置查询解析器的重写方法:

myCustomQueryParser.SetMultiTermRewriteMethod(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE)
于 2012-04-27T15:13:04.177 回答