【问题标题】:Order of words in Lucene proximity searchLucene 邻近搜索中的单词顺序
【发布时间】:2015-02-23 13:10:17
【问题描述】:

是否可以指定单词的顺序对于 Lucene 邻近搜索是否重要?

"word1 word2"~3 => 单词顺序很重要(InOrder = true)

有没有一种等效的方法来编写一个顺序无关紧要的查询?比如:

"word1 word2"~3x => 词序无关(InOrder = false)

我知道对于 SpanNearQuery,InOrder 属性决定了顺序是否重要,但我无法告诉 QueryParser InOrder 对于特定的 SpanNearQuery 应该为真还是假。

我是否需要为此编写自己的 QueryParser 以支持自定义语法来处理此类查询?

【问题讨论】:

    标签: lucene lucene.net


    【解决方案1】:

    你有它倒退。 QueryParser 始终将 InOrder 设置为 false。

    InOrder = false 并不意味着顺序无关紧要。这意味着秩序没有得到严格维护。顺序仍然很重要,因为接近度值是 levenshtein 距离。交换两个单词的顺序会使距离增加 2。如果您尝试将距离增加 2,您可能会看到相反顺序的匹配项。

    至于您是否可以构造查询以设置是否应在查询解析器中维护顺序:不。您不能。它不支持那个。

    您可以改用Surround Query Parser,它旨在处理更复杂的跨度查询。但是,语法很多 不同,我不知道是否有.Net 版本。它在 Lucene 3.0.3 中出现,但当时它是一个 contrib 包。

    【讨论】:

    • 感谢您的回答!我正在使用 ComplexPhraseQueryParser 的自移植 .net 版本,其中 InOrder 始终为真。这就是为什么我认为这也是 QueryParser 的默认行为。不幸的是,似乎 Lucene.Net 和 Lucene.Net.Contrib 不包含环绕包。所以我想我要么必须等到新版本的 Lucene.Net 发布,要么自己编写类似 Surround QueryParser 的东西
    • 我刚刚测试了 InOrder 属性,结果表明对于 InOrder=false 术语的顺序确实无关紧要:“term1 term2” slop=0 InOrder=true 导致 9 个命中,“ term2 term1" slop=0 InOrder=true 导致 5 次点击,"term1 term2" slop=0 InOrder=false 导致 14 次点击,"term2 term1" slop=0 InOrder=false 导致 14 次点击,或者我错过了什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多