Lucene只匹配精确查询忽略重复的术语

时间:2014-09-15 01:03:30

标签: regex lucene

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

foo
bar
foobar
foo foo bar

如果我搜索' bar',我只想要返回第二个节点。

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

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

1 个答案:

答案 0 :(得分:0)

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

  • TermQuery仅匹配指定的文档,而不是倍数
  • TermQuery("nodeName","bar")也会匹配最后一个示例,而不是根本不匹配。

如果您还需要能够对此字段中的已分析文本执行更多标准(全文)搜索,我建议您在两个单独的字段中对相同内容编制索引,一个TermQuery("nodeName","foo foo bar")和一个{{1 }}