2

アップデート

私はNHibernate.Search.Testsプロジェクトを調べて、Criteria API がどのように使用されているかを調べてきました (実際の例を得るためにテスト コードを調べると非常に便利だと思います)。は根本的に異なります。以下に 2 つのテストを示します。1 つは基準 API を使用し、もう 1 つは従来のクエリ スキーマを使用します。

[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
        }

2番目のソリューションは vb.net の下で機能しますが、便利な Lucene クエリ (対応する行の独自の合計を開始する) と Lucene の順序付け (または見つけられなかった) を犠牲にして機能します。


こんにちは、みんな、

再び、私は道に迷いましたが、今回は、私の通常の不安定なエラーよりも少し不吉な何かを疑っています (不吉な音楽をキューに入れます)

Lucene.netを使用した全文検索と、ページングおよび Criteria APIを組み合わせようとしています。

これまでのところ、ページングと全文検索は問題なく動作しています。しかし最近では、条件 API を使用して特定のフィルターをクエリに追加する必要がありました。だから私がしたことは次のとおりでした:

以下を使用して Nhibernate.Search クエリ オブジェクトを作成します。

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 クエリ オブジェクトに指定された型名とCriteriaオブジェクトのEntityOrClassNameプロパティが比較されていることがわかります。FullTextQueryImplがNameを使用し、CriteriaFullnameを使用するため、ここに問題が発生します。CriteriaImplクラスのコンストラクター コードを次に示します。

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

その結果、比較は失敗し、例外がスローされます。比較はエイリアスを使用していないため、エイリアスをいじってみましたが、役に立ちませんでした。

全文検索と Criteria API の組み合わせで何か大きなものが欠けているのでしょうか、それとも別の何かでしょうか? vb.netに関連している可能性があるという奇妙な感じがするので、C#で期待どおりに動作しますか?

読んでくれてありがとう、

サミー

4

1 に答える 1

1

これは NHibernate.Search のリビジョン 1611 で解決されたようです:

リビジョン: 1611

メッセージ: 完全なクラス名が部分的な名前と比較されていたバグを修正しました。これにより、LuceneQueryTest.UsingCriteriaApi が失敗していました。

変更: /trunk/src/NHibernate.Search/src/NHibernate.Search/Query/FullTextQueryImpl.cs

svn : https://nhcontrib.svn.sourceforge.net/svnroot/nhcontrib/trunk/src/NHibernate.Search/

于 2011-05-05T18:41:43.030 に答える