2010-12-23 5 views
1

文字列の形式でクエリ文を受け入れることができる検索エンジンを作成するとします。このステートメントは、特定の特性セットを持ち、場合によっては他のオブジェクトにリンクされた、さまざまな種類のオブジェクトを取得するために使用できます。 OOPアプローチを使用する単純な英語または擬似コードでは、次のように文の解析と処理を行い、一連の目的のオブジェクトを取得する方法はありますか?アルゴリズムの検索:リクエストOOPスタイルの解析と処理

  • は、りんごの色緑
  • のget様々な果物を取得し、アンディ
  • から梨が色「深紅」と原点とイチゴを得ることはありませスペイン
  • は2010-10の間メロンの売上高の合計を取得します-10と2010-12-30
  • は「ピート」からバナナの最後deliverydateを取得し、状態が

を販売していないが問題がクリアされている願っています。そうでなければ、私は再調整すること以上に喜んでいます。

P.S:これは宿題ではありません。)

答えて

4

この問題は、Luceneなどのドキュメント指向のストアに適しています。たとえば、あなたは、このような

タイプ
としてスキーマを設計することができバラエティ

起源 DateSold など :

次に、あなたがそのようなタイプとして、Luceneクエリを書くことができます:果物やカラー:グリーン。また、(Fruit:Straberry AND Color:Deep Red)AND NOT Origin:Spainなどのネストされたクエリを作成することもできます。

Apache Luceneは、ほとんどの主要言語で利用可能なポルトを備えたJavaライブラリです。 Apache Solrは、Lucene libを使用して構築された本格的な検索サーバーであり、RESTful APIを備えているため、選択したプラットフォームに簡単に統合できます。

BTW Solrには、上記の各基準を使用して結果をフィルタリングできるファセットがあります。ユーザーは果物を検索ボックスに入力して結果を返します。


型: - フルーツ(109) - ナット(99)

起源: - スペイン(32) - フランス(39)

色: - レッド(22 ) - ファセットフィルタの各々にディープレッド(45)


クリックその交差点の結果。したがって、ユーザフレンドリーなインタラクションモデルが必要な場合は、ユーザに豊富なLuceneクエリを入力させるよりも、ファセッティング/フィルタリングがはるかに簡単です。

更新:自然言語のクエリを入力して分解するには、字句解析を行う必要があるかもしれませんが、非常に難しい課題がある場合は、単純な&強力な面付けアプローチを使用することをお勧めします。 希望に役立ちます。

1

あなたはミニ言語を開発しているようにあなたは、構文と解析に関係しているので、それは、聞こえます。だから、レクサーとパーサーを生成するために使用される多くのツールをチェックしてください。ここから始めてください:http://en.wikipedia.org/wiki/Lexical_analysis

+0

実際に:)。また、分解された要求のディスパッチ方法を知ることにも興味があります。 –

+0

James:それはあなたが照会しているものに強く結びついています。 –

+0

私は参照してください。私は、リクエスト文字列を分解し、サブリクエストを単一のObject型を扱う一連のメソッドにディスパッチするメソッドを持つことをお勧めします。別の方法で表現すると、作成、読み取り、更新、削除メソッドを持つDAOクラスがあるとします。次に、属性(日付スパンや色)を継承する基準や他のクラスとの関連付けに従って、一連のオブジェクトを返す追加のメソッドが必要だとします。 –

1

私はジョンに同意します。

A)検索の統計を取り、インデックス Cにそれらを使用する)字句解析で を起動します)これはしかしちょうど野生の推測である可能性が関連検索に

を分析して関係を検索し、前にそれを試したことがありません。