【问题标题】:How to get more out of Lucene.net如何充分利用 Lucene.net
【发布时间】:2009-02-10 13:40:50
【问题描述】:

我正在尝试将 Lucene.net 合并到我的网络搜索中。

目前我有一个 lucene.net 索引,其中包含 +100 万个文档,每个文档有 7 个字段。 最后一个字段是“全部”字段,它连接了前面字段的内容。搜索所有字段非常快:)

但我觉得这里还有更多内容。如何在不使用“all”字段的情况下在所有字段中搜索一个或多个空格分隔的字符串?
我希望能够给某些领域赋予权重。此外,如果搜索包含有关命中发生地点的信息,那将非常好,这样我就可以在结果中显示它。

我认为这一切都是可能的,但我不知道怎么做。
有什么帮助吗?

【问题讨论】:

    标签: lucene.net


    【解决方案1】:

    我们做类似的事情,诀窍是在你的查询字符串中指定字段:

    (+Tier1:ribbon^1)^4 OR (+Tier2:ribbon^1)^4 OR (+Tier3:ribbon^1) OR (+Tier4:q*ribbon*^1)^12
    

    在上面的示例中,用户在我们的应用程序中搜索了“ribbon”。我们在不同的字段中有不同的数据段,最终字段“Tier4”包含连接在一起的所有前面的术语。我们在字段前面加上一个“q”,所以我们也可以做前导通配符:

    (+Tier4:q*ribbon*^1)^12
    

    最后,我们使用带有插入符号 (^) 的提升。这最终会以不同的方式衡量事物。需要一段时间才能得到正确的提升,我仍然对它们不是 100% 满意,但它们确实产生了巨大的影响。

    【讨论】:

    • 所以如果它说 (+Tier1:ribbon^1)^4 这意味着,在字段 Tier1 中查找“ribbon”这个词,并将其结果赋予 4 的权重?您有关于如何创建查询字符串的简单资源吗?
    • 前导通配符需要像前置字符这样的技巧是很愚蠢的。知道为什么吗?
    • 我们不得不去Java文档获取查询字符串信息。另外,要注意很多术语。您可能需要调用 .setMaxClauseCount() 否则会引发异常。
    • 我记得读过有关通配符问题的文章,但我并没有真正相信他们给出的理由。
    【解决方案2】:

    我认为您不需要维护“全部”字段。

    1. 看看使用“MultiFieldQueryParser”。它不接受查询解析器使用的单个默认字段,而是接受字段名称数组(除了索引分析器)。
    2. 术语提升应该按照“QueryParser”工作(即不需要特殊操作)。我应该补充一点,我发现标准评分对我来说似乎没问题(字段长度、匹配数等),而无需使用增强术语。
    3. Lucene.Net(嗯,目前肯定是 SVN 2.3 构建)包括来自 Java 源代码的 Highlight 包的端口。它确实有一些怪癖(其中最重要的一点是,一开始可能会很棘手),但它基本上是有效的。

    祝你好运

    【讨论】:

    • 我会看看 MultiFieldQueryParser。谢谢
    • 似乎使用 MultiFieldQueryParser 创建了一个查询,其中我的术语必须存在于所有查询的字段中。我可以以某种方式改变它吗?
    • 由于这里没有PM功能,在我开始实施之前,您对highlight包有什么建议吗?
    • 1) 不客气! 2)您是否尝试过一个简单的测试用例来验证这一点? 3)这里的代码(stackoverflow.com/questions/189366/…)看起来不错,但是在调用它之前不要忘记使用查询重写。
    • 我猜是“个人信息”。
    【解决方案3】:

    你必须得到Lucene in Action。虽然关于原始(即 Java)Lucene 实现,但它包含您需要的所有信息:关于 boosts、highlighters、qwery 解析器等。

    【讨论】:

    • 如果这是我认为的解决方案,我会立即考虑让自己获得更多的 Lucene 资源。到目前为止,这似乎将取代我的整个搜索算法。我不介意:)
    猜你喜欢
    • 1970-01-01
    • 2017-10-05
    • 2018-03-20
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 2022-09-01
    相关资源
    最近更新 更多