検索文字列を解析します(NHibernate Criteriasに)
-
05-07-2019 - |
質問
プロジェクトに高度な検索を実装したいと思います。 検索権限は、ユーザーが入力したすべての文字列を使用し、クライテリアAPIと1つの大きな分離を行います。
これは正常に機能しますが、ここでさらに機能を実装したいと思います:AND、OR、および角括弧()
文字列を解析し、文字列から条件を作成するのに苦労しています。 このStackoverflowの質問を見つけましたが、本当に助けにはなりませんでした(彼はしませんでした)彼が望んでいたことは明らかです。)
別の記事を見つけましたが、これはさらに多くをサポートし、SQLステートメントを吐き出します。 私が聞いたことのある別のことはLuceneですが、これが本当に役立つかどうかはわかりません。
少し検索してみたところ、Lucene.Net WhitespaceAnalyzerとQueryParserが見つかりました。
検索A AND B OR Cを+ A + B Cのようなものに変更します。これは正しい方向への適切なステップです(さらに括弧を処理します)。 次のステップは、変換された文字列を接続詞と選言のセットに取得することです。
私が見つけたJavaの例は、NHibernateで見つけることができなかったクエリビルダーを使用していました。
その他のアイデア?
解決 2
基本的に私が今していることは、Lucene.Net解析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
}
}
その後、この文字列を手動で解析し、選言と接続詞を作成しています。
他のヒント
Nhibernate Searchは下でluceneを使用し、AND、OR、文法を使用するすべてのオプションをuに提供します。
あなたがしなければならないのは、インデックスを作成するためにエンティティの属性を設定するだけです。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();
強力ですよね?