3

プロジェクトに高度な検索を実装したいと考えています。現在の検索では、ユーザーが入力したすべての文字列が使用され、Criteria API との 1 つの大きな論理和が作成されます。

これで問題なく動作しますが、さらに多くの機能を実装したいと思います: AND、OR、ブラケット()

文字列を解析し、文字列から基準を構築するのに苦労しました。私はこの Stackoverflow questionを見つけましたが、実際には役に立ちませんでした (彼は自分が何を望んでいるのかを明確にしませんでした)。

別の記事を見つけましたが、これはさらに多くのことをサポートし、SQL ステートメントを吐き出します。もう 1 つよく言及されているのは Lucene ですが、これが本当に役立つかどうかはわかりません。


少し調べてみたところ、Lucene.Net WhitespaceAnalyzer と QueryParser が見つかりました。

検索 A AND B OR C を +A +BC のようなものに変更します。これは、正しい方向への良い一歩です (さらに、括弧を処理します)。次のステップは、変換された文字列を接続詞と論理和のセットに取得することです。

私が見つけたJava の例は、NHibernate では見つけられなかったクエリ ビルダーを使用していました。

もっとアイデアはありますか?

4

2 に答える 2

3

今までNhibernate Searchについて聞いたことがないと思います

Nhibernate Search はその下で lucene を使用し、AND、OR、文法を使用するすべてのオプションを提供します。
あなたがしなければならないのは、あなたのエンティティをインデックス付けする属性にすることだけで、Nhibernate は定義済みの場所でそれをインデックス化します。
次回は、lucene が公開する機能を使用してこのインデックスを検索し、ドメイン レベルのエンティティ オブジェクトを取得できます。

using (IFullTextSession s = Search.CreateFullTextSession(sf.OpenSession(new SearchInterceptor()))) {

        QueryParser qp = new QueryParser("id", new StopAnalyzer());

        IQuery NHQuery = s.CreateFullTextQuery(qp.Parse("Summary:series"), typeof(Book));

        IList result = NHQuery.List();

パワフルですね。

于 2009-09-11T06:35:17.320 に答える
1

私が現在基本的に行っていることは、Lucene.Net parse API を使用して入力文字列を解析することです。これにより、統一された単純化された構文が得られます。(疑似コード)

using Lucene.Net.Analysis;
using Lucene.Net.Analysis.Standard;
using Lucene.Net.QueryParsers;
using Lucene.Net.Search;

void Function Search (string queryString)
{
    Analyzer analyzer = new WhitespaceAnalyzer();
    QueryParser luceneParser = new QueryParser("name", analyzer);
    Query luceneQuery = luceneParser.Parse(queryString);
    string[] words = luceneQuery.ToString().Split(' ');

    foreach (string word in words)
    {
        //Parsing the lucene.net string
    }
}

その後、この文字列を手動で解析し、論理和と接続詞を作成しています。

于 2009-09-11T09:55:13.813 に答える