我一直在街上到处找
NHibernate.Search.Tests
项目来了解CriteriaAPI是如何使用的(我发现查看测试代码以获得工作示例非常有用),我注意到使用全文搜索的方式完全不同。以下是两个测试,一个使用criteria API,一个使用经典查询模式:
[Test]
public void ResultSize()
{
IFullTextSession s = Search.CreateFullTextSession(OpenSession());
ITransaction tx = s.BeginTransaction();
// snipped the objects creation
QueryParser parser = new QueryParser("title", new StopAnalyzer());
Lucene.Net.Search.Query query = parser.Parse("Summary:noword");
IFullTextQuery hibQuery = s.CreateFullTextQuery(query, typeof(Clock), typeof(Book));
Assert.AreEqual(0, hibQuery.ResultSize);
// snipped the end of the test
}
[Test]
public void UsingCriteriaApi()
{
IFullTextSession s = Search.CreateFullTextSession(OpenSession());
ITransaction tx = s.BeginTransaction();
// snipped creation
IList list = s.CreateCriteria(typeof(Clock))
.Add(SearchRestrictions.Query("Brand:seiko"))
.List();
Assert.AreEqual(1, list.Count, "should get result back from query");
// snipped deletion
}
第二个解决方案在vb.net下工作
,代价是有用的Lucene查询(该查询包含它自己对应行的总数),代价是Lucene排序(或者我找不到它)
再一次,我在这条路上被难住了,但这次,我怀疑一些比我通常的不稳定错误更险恶的事情(
暗示不祥的音乐
我正在尝试使用
Lucene.net
到目前为止,分页和全文搜索一直在完美地工作。不过,最近我们不得不使用CriteriaAPI向查询添加特定的过滤器。所以我做了以下几点:
Private Function GetQuery(ByVal QueryString As String, ByVal Orders() As String) As IFullTextQuery
Dim ifts As IFullTextSession = Search.CreateFullTextSession(UnitOfWork.CurrentSession)
Dim analyzer As New SimpleAnalyzer
Dim parser As New MultiFieldQueryParser(SearchPropertyNames, analyzer)
Dim queryObj As Lucene.Net.Search.Query = parser.Parse(QueryString)
Dim nhsQuery As IFullTextQuery = ifts.CreateFullTextQuery(queryObj, New System.Type() {GetType(T)})
For i As Integer = 0 To Orders.Count - 1
Orders(i) = Orders(i) & "FS"
Next
nhsQuery.SetSort(New Sort(Orders))
然后将我的条件添加到查询:
Dim crit As ICriteria = ifts.CreateCriteria(GetType(T))
Dim criterion As ICriterion
If criteria IsNot Nothing Then
For Each criterion In criteria
If (Not criterion Is Nothing) Then
crit.Add(criterion)
End If
Next
End If
nhsQuery.SetCriteriaQuery(crit)
但是当我列出结果查询时,我收到以下异常
条件查询实体应与查询实体匹配
FullTextQueryImpl
源文件(方法)
GetLoader
)显示给定给NHibernate.Search查询对象的类型名称与
EntityOrClassName
财产
标准
对象这就是我的问题所在,因为
FullTextQueryImpl
名称
,以及
标准
使用
全名
标准
班
Public Sub New(ByVal persistentClass As Type, ByVal session As ISessionImplementor)
Me.New(persistentClass.FullName, CriteriaSpecification.RootAlias, session)
Me.persistentClass = persistentClass
End Sub
Dim entityOrClassName As String = DirectCast(Me.criteria, CriteriaImpl).EntityOrClassName
If ((Me.classes.GetLength(0) = 1) AndAlso (Me.classes(0).Name <> entityOrClassName)) Then
Throw New SearchException("Criteria query entity should match query entity")
End If
结果,比较失败并引发异常。我尝试过使用别名,但没有效果,因为比较没有使用别名。
在我的全文搜索和CriteriaAPI的混合中,我是否遗漏了一些重要的东西,或者是其他什么东西?它在C#中是否像预期的那样工作,因为我有一种奇怪的感觉,它可能与vb.net有关?
谢谢你的阅读,
萨米