0

我正在使用以下代码通过 nhibernate.search 查询 lucene 索引:

var fts = NHibernate.Search.Search.CreateFullTextSession(this._session);

var luceneQuery = "Search:name~0.7 AND Moderated:true NOT PlaceType:WrongType";

var places = fts.CreateFullTextQuery<Place>(luceneQuery)
            .List<Place>();

问题是查询返回所有类型的 Places,包括 WrongType。当我尝试对 Luke 中的同一索引运行相同的查询时,一切正常,不会返回 WrongType 类型的位置。

搜索字段是 Place 对象中许多字段的串联。正如我所发现的,我正在使用 Moderated 和 PlaceType 字段过滤掉一些记录,这样可以保留来自 Lucene 查询的原始排序顺序(按分数)。

如何使用 NHibernate.Search 从结果中按 PlaceType 排除 Places?

4

1 回答 1

0

好的,所以我找到了解决方案。

我已经使用 WhiteSpaceAnalyzer 索引了所有字段。似乎 NHibernate.Search 默认使用 StandardAnalyzer,不管事实如何,我已将全局 AnalyzerClass 设置为 WhiteSpaceAnalyzer。解析查询后,它看起来像这样:

"+Search:name~0.7 +Moderated:true -PlaceType:wrongtype"

这不起作用,因为 PlaceType 字段中的值没有小写。

将问题中的代码更改为以下内容:

var fts = NHibernate.Search.Search.CreateFullTextSession(this._session);

var queryParser = new QueryParser("text", new WhitespaceAnalyzer());
var luceneQuery = "Search:name~0.7 AND Moderated:true NOT PlaceType:WrongType";
var query = queryParser.Parse(luceneQuery);

var places = fts.CreateFullTextQuery(query, typeof(Place))
            .List<Place>();

解决了这种情况。

于 2011-04-28T10:46:21.030 回答