使用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()之间的区别是什么?
答案 0 :(得分:2)
TermQuery
比通过queryparser运行查询简单得多。它不仅没有小写,也不理解分解带有连字符的术语,它甚至都没有被标记化。它只是搜索你告诉它寻找的术语。这意味着它会在您的索引中将“Some-Url-Friendly-Title”这个术语作为单个未加标记的关键字。我假设您使用的是分析仪,因此很可能没有这样的标记。
更进一步,如果你一直在寻找“一些Url友好标题”作为术语文本,你仍然不会想出任何东西,因为它正在寻找“一些Url友好标题”作为一个单一令牌,而不是索引中的四个令牌(或更确切地说,术语)。
如果查看解析查询时standard query parser生成的内容,您会发现TermQueries只是用于生成完整查询的构建块之一,还有BooleanQuery ,可能PhraseQuery,PrefixQueriy等
答案 1 :(得分:0)
在Lucene.Net 3.0.3版中,由于它的保护修饰符,GetFieldQuery无法访问。使用
MultiFieldQueryParser.Parse(searchText, field)
代替。