2009-08-13 81 views
3

说我的要求是如何过滤我的lucene搜索结果?

"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 

然而,有IM难度翻译到这个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是正确的使用方法,我该如何制作合适的过滤器?如果不是,我该怎么做,我该怎么做?

谢谢!

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

谢谢

回答

1

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

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

1

使用QueryWrapperFilter。

+0

你能举个例子吗?在Lucene.Net中QueryFilter只接受LunceneQueries,而不是nhib查询。我如何创建查询(如果可能,以通用的方式创建,而不仅仅是“age> = 18”)?谢谢 – 2009-08-14 08:42:23

2

因为你需要一个range search,写在Lucene的类似的语法年龄字段:

age:[18 TO 100] 

甘道夫说,你可以使用一个QueryWrapperFilter。我不确定这是否存在于Nhibernate Search中。同样,您可以使用“AND”来进一步限制您的查询。 我不确定你可以做什么关于未索引的属性。