给定一个索引,其中属性' nodeName'反映下面的列表,我如何使用Lucene只返回名称完全匹配的节点?
foo
bar
foobar
foo foo bar
如果我搜索' bar',我只想要返回第二个节点。
我认为我可以在搜索字词中使用正则表达式(类似"+nodeName:\"/^{0}$\"
,其中{0}是查询)来匹配字符串的开头和结尾,但这不起作用 - 它返回包含查询的所有节点。
还尝试了包含范围("+nodeName: [{0} TO {0}]")
但未返回任何内容。
答案 0 :(得分:0)
正则表达式查询并不能真正帮助您。查询中的正则表达式不能跨越多个分析的术语。确保匹配跨越字段的整个内容的最佳方法是以便于该方式(即作为单个标记)的方式对其进行索引。我假设这是使用TextField
的{{1}},或类似的东西。为了匹配整个输入,StandardAnalyzer
将是一个不错的选择,它将整个字段索引为一个标记。然后可以使用简单的StringField
进行此类搜索:
TermQuery
仅匹配指定的文档,而不是倍数TermQuery("nodeName","bar")
也会匹配最后一个示例,而不是根本不匹配。如果您还需要能够对此字段中的已分析文本执行更多标准(全文)搜索,我建议您在两个单独的字段中对相同内容编制索引,一个TermQuery("nodeName","foo foo bar")
和一个{{1 }}