Lucene.net GetFieldQuery vs TermQuery

时间:2013-02-04 21:09:08

标签: lucene

使用Lucene的标准分析仪。所讨论的标题字段未被存储,分析。查询如下:

title:"Some-Url-Friendly-Title"

在Luke中,此查询被正确地重写为:

title:"some url friendly title" (- replaced by whitespace, everything lowercased).

我认为 Lucene.net版本将是:

new TermQuery(new Term("title","Some-Url-Friendly-Title"))

但是,不会返回任何结果。

然后我尝试了:

_parser.GetFieldQuery("title","Some-Url-Friendly-Title")

它按预期工作!

两个查询都通过以下方式执行:     _searcher.Search([查询对象],[排序对象])

有人能指出我正确的方向,看看TermQuery和_parser.GetFieldQuery()之间的区别是什么?

2 个答案:

答案 0 :(得分:2)

TermQuery比通过queryparser运行查询简单得多。它不仅没有小写,也不理解分解带有连字符的术语,它甚至都没有被标记化。它只是搜索你告诉它寻找的术语。这意味着它会在您的索引中将“Some-Url-Friendly-Title”这个术语作为单个未加标记的关键字。我假设您使用的是分析仪,因此很可能没有这样的标记。

更进一步,如果你一直在寻找“一些Url友好标题”作为术语文本,你仍然不会想出任何东西,因为它正在寻找“一些Url友好标题”作为一个单一令牌,而不是索引中的四个令牌(或更确切地说,术语)。

如果查看解析查询时standard query parser生成的内容,您会发现TermQueries只是用于生成完整查询的构建块之一,还有BooleanQuery ,可能PhraseQueryPrefixQueriy

答案 1 :(得分:0)

在Lucene.Net 3.0.3版中,由于它的保护修饰符,GetFieldQuery无法访问。使用

MultiFieldQueryParser.Parse(searchText, field) 

代替。