说我的要求是
"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并检查一些未索引的属性。任何给出的解决方案都需要支持这一点。
由于
答案 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是最好的选择。