【问题标题】:Lucene .net Boost not working when using * wildcard使用 * 通配符时 Lucene .net Boost 不起作用
【发布时间】:2012-05-08 07:21:08
【问题描述】:

我有两份文件并使用 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

搜索应用程序* 返回不分先后,分数相同

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 或城市为 Lund 的文档更高的评级。这是因为我会知道哪些文件最受欢迎。我想获取包含城市 Stockholm 和名称 Stockholm 和 Stockholmen 的文件,但按我的选择订购。

【问题讨论】:

    标签: c# .net lucene lucene.net


    【解决方案1】:

    由于 WildcardQueryMultiTermQuery 的子类,因此您的得分恒定为 1。

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

    t.getBoost() 是查询 q 中术语 t 的搜索时间提升 在查询文本中指定(参见查询语法),或由 应用程序调用 setBoost()。注意确实没有直接 用于在多词查询中访问一个词的提升的 API,但是 相当多的术语在查询中表示为 multi 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)
    

    【讨论】:

    • 这是一个我在看书和搜索时都很难找到的答案。谢谢,知道它是如何工作的,解决问题会容易得多。
    • @JustusTh 很高兴知道它对您有所帮助。
    • 它确实有所帮助,但也许还没有完全解决,会继续努力的。我认为这很简单,因为我认为我的问题是很多人想要的。
    • 为什么 SetMultiTermReWriteMethod 被认为是 hack?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 2014-08-01
    • 2015-09-09
    • 2017-11-02
    • 1970-01-01
    相关资源
    最近更新 更多