【问题标题】:Lucene match only exact query ignoring repeated termsLucene 只匹配精确查询,忽略重复项
【发布时间】:2014-09-15 01:03:30
【问题描述】:

给定一个索引,其中属性“nodeName”的值反映了下面的列表,我如何使用 Lucene 只返回名称完全匹配的节点?

foo
bar
foobar
foo foo bar

如果我搜索“bar”,我只希望返回第二个节点。

我想我可以在搜索词中使用正则表达式(类似于"+nodeName:\"/^{0}$\",其中 {0} 是查询)来匹配字符串的开头和结尾,但这不起作用 - 它返回包含查询。

还尝试了一个包含范围 ("+nodeName: [{0} TO {0}]"),但没有返回任何内容。

【问题讨论】:

    标签: regex lucene


    【解决方案1】:

    Regex 查询在这里并不能真正帮助您。查询中的正则表达式不能跨越多个分析的术语。确保匹配跨越字段的全部内容的最佳方法是以促进该匹配的方式对其进行索引,即作为单个标记。我假设这是使用StandardAnalyzerTextField 或类似的东西。为了匹配整个输入,StringField 将是一个不错的选择,它将整个字段索引为一个标记。然后可以使用简单的TermQuery 进行此类搜索:

    • TermQuery("nodeName","bar") 只会匹配指定的文档,而不是多个
    • TermQuery("nodeName","foo foo bar") 也会匹配上一个示例,而不是根本不匹配。

    如果您还需要能够对该字段中的分析文本执行更多标准(全文)搜索,我建议在两个单独的字段中索引相同的内容,一个 StringField 和一个 TextField

    【讨论】:

    • 感谢您的建议 - 我重新考虑了我的方法,最终没有使用 Lucene。得到了我需要的结果,一切都很好。
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    相关资源
    最近更新 更多