1

使用 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([query object], [sort object])

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

4

2 回答 2

2

ATermQuery比通过查询解析器运行查询要简单得多。它不仅没有小写,而且无法分解连字符的术语,甚至没有被标记化。它只是搜索您告诉它要查找的术语。这意味着它正在您的索引中寻找术语“Some-Url-Friendly-Title”作为单个未标记的关键字。我假设您正在使用分析器,因此很可能不存在此类令牌。

更进一步,如果您一直在搜索“Some Url Friendly Title”作为术语文本,您仍然不会想出任何东西,因为它正在寻找“Some Url Friendly Title”作为单个标记,而不是作为索引中的四个标记(或更确切地说,术语)。

如果您查看标准查询解析器在解析查询时生成的内容,您会发现 TermQueries 只是它用于生成完整查询的构建块之一,还有BooleanQuery,可能还有PhraseQueryPrefixQueriy等。

于 2013-02-05T00:18:05.497 回答
0

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

MultiFieldQueryParser.Parse(searchText, field) 

反而。

于 2013-02-12T23:35:12.250 回答