3

说我的要求是

"search for all users by name, who are over 18"

如果我使用 SQL,我可能会写如下内容:

Select * from [Users]
Where ([firstname] like '%' + @searchTerm + '%' OR 
       [lastname] like '%' + @searchTerm + '%')
    AND [age] >= 18

但是,我很难将其翻译成 lucene.net。

这是我到目前为止所拥有的:

var parser = new MultiFieldQueryParser({ "firstname", "lastname"}, new StandardAnalyser());
var luceneQuery = parser.Parse(searchterm)

var query = FullTextSession.CreateFullTextQuery(luceneQuery, typeof(User));

var results = query.List<User>();

我如何添加“年龄> = 18”位?

我听说过.SetFilter(),但这只接受 LuceneQueries,而不接受 IQueries。如果SetFilter使用正确,我该如何制作合适的过滤器?如果没有,我用什么,我该怎么做?

谢谢!

PS这是一个大大简化的版本,我试图做的清楚,我的WHERE条款实际上比这里显示的要复杂得多。实际上,我需要检查子查询中是否存在 id 并检查许多未索引的属性。任何给出的解决方案都需要支持这一点。

谢谢

4

3 回答 3

2

对于年龄字段,您需要一个范围搜索,用 Lucene 的语法编写,例如:

age:[18 TO 100]

正如 Gandalf 所说,您可以使用QueryWrapperFilter。我不确定这是否存在于 Nhibernate Search 中。同样,您可以使用“AND”来进一步限制您的查询。我不确定您可以对未索引的属性做些什么。

于 2009-08-13T20:42:10.017 回答
1

最后,我取消了 NHibernate.Search 并直接与 lucene 对话以获取 ID,然后将它们传递到 HQL where 子句中,简单得多,效率更高。

编辑: NH.Search 中有一个限制阻止它工作。它可以简单地修补,但是一旦您阅读了 NH.S 代码,您就会意识到它的效率是多么低下。直接去Lucene是最好的选择。

于 2010-07-16T11:52:14.777 回答
1

使用 QueryWrapperFilter。

于 2009-08-13T19:58:47.423 回答