如何过滤我的lucene搜索结果?

时间:2009-08-13 10:43:20

标签: nhibernate lucene lucene.net nhibernate.search

说我的要求是

"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>();

如何添加“where age&gt; = 18”位?

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

谢谢!

P.S。这是我为了清晰起见而做的非常简化的版本,我的WHERE子句实际上比这里显示的要复杂得多。实际上,我需要检查子查询中是否存在id并检查一些未索引的属性。任何给出的解决方案都需要支持这一点。

由于

3 个答案:

答案 0 :(得分:2)

对于年龄字段,你需要一个range search,用Lucene的语法写成:

age:[18 TO 100]

甘道夫说,你可以使用QueryWrapperFilter。我不确定Nhibernate Search中是否存在这种情况。类似地,您可以使用“AND”来进一步约束您的查询。 我不知道你可以对未编入索引的属性做些什么。

答案 1 :(得分:1)

使用QueryWrapperFilter。

答案 2 :(得分:1)

最后我取消了NHibernate.Search并直接与lucene交谈以获取ID,然后将这些ID传递给HQL where子句,非常简单,效率更高。

编辑:NH.Search中存在限制,阻止此操作。它可以简单地修补,但是一旦你阅读了NH.S代码,你就会发现它的效率非常低。直接去Lucene是最好的选择。