5

バックグラウンド:

さまざまな種類のイベント (コンサート、サッカーの試合、チャリティー コレクションなど) を表す SQL データベースで、それぞれにイベント関連のデータ (コンサート - アーティスト名、試合 - ホスト/ビジター チーム) が含まれています。これらのイベントはeventすべて、それらすべてに関連するデータ (名前、説明、場所、開始日/終了日) を含む 1 つの一般テーブルから継承されます。継承は、 HibernateまたはDoctrineで知られるサブクラスごとのテーブル モデルを使用して実装されます。データベースには、 および テーブルで使用されるテーブル ( 、 、 ) および ( 、 、 ) も格納されartistsますid( nameFKbirth_datefootball_teams介しidname) 。countrycoach_nameevent_concertsevent_football_matches

問題:

{name: "manchester", startDate: "01.01.2012 - 01.02.2012"}いくつかの基準 (または{location: "london", description: "artists +metallica -bieber"}) を指定して、基準を満たすすべてのイベントとartists/football_teamsテーブルからの結果を返す検索エンジンを作成します。

これらのイベントの一部のプロパティには、全文検索方法で検索する必要がある大きなテキストが含まれています。

例:

次の検索条件が与えられた場合:

{ location: "london", startDate: "05.11.2012 - 07.11.2012" }

検索エンジンは次を返す必要があります。

  1. (サッカー イベント) アーセナル対マンチェスター ユナイテッドの試合、エミレーツ スタジアム、ロンドン、2012 年 6 月 11 日
  2. (コンサート イベント) メタリカ コンサート、Some-Fancy-Location、05.11.2012
  3. (サッカー チーム/イベントではありません) アーセナル、設立: 1886 年、リーグ: プレミア リーグ
  4. (サッカーチーム/イベントではありません) チェルシー、設立: 1905年、リーグ: プレミアリーグ
  5. (フェスティバル イベント) ロンドンのハロウィーン、2012 年 7 月 11 日
  6. (ダンス イベント) サドラーズ ウェルズの眠れる森の美女、£45、2012 年 7 月 11 日
  7. (ミュージシャン、イベントではありません) ニール・クリスチャン、1943 年 - 2012 年、ロックンロールのボーカリスト

ご覧のとおり、startDate (イベント関連のプロパティ) はイベントの場合にのみ考慮されます。


検索エンジンは多くのテーブルをスキャンする必要があるため、専用のソフトウェア (Sphinx、Lucene、...?) を使用して、検索専用の別のインデックスを作成する必要があると考えています。


そのようなインデックスを構築するための解決策を提案できる人はいますか? その検索エンジンのベースとして、どのソフトウェアを使用できますか?


編集:

明確にするために、どのプロパティも必須ではありません。それらには、完全一致を使用して検索される日付が含まれているものもあれば、完全一致を使用して検索される短いテキスト (場所など) が含まれているものもあります。ただし、それらの一部には長いテキストが含まれているため、全文検索する必要があります。

4

5 に答える 5

3

3つのアプローチが見えます。

  • Couchdb に移行します。location+start time検索を行うには、[location, event_start_time]as キーを使用してビューを作成します。検索時には、 を使用してクエリを実行します?startkey=["london,"05.11.2012"]&endkey=["london", "07.11.2012"]。で全文検索を有効にするにはdescription、次のような特定のビューを作成します

  • ElasticSearchインデックスを構築します。あなたの例での検索は、2 つのデータ フィールドを使用した単なる構造化されたクエリであり、これlocationは必須であり、イベントstart timeは範囲です。Elasticsearch の全文検索はより強力です。特定のアナライザーを定義して、データ内のテキストを処理できます。Elasticsearch は、地理空間データを使用した検索もサポートしています。

  • Amazon CloudSearchを使用します。既知の制限がいくつかあります。気に入らなかったものをいくつか挙げます:

    • ドキュメントのサイズは 1MB 未満です。
    • フィールドには最大 100 個の値を指定できます。
    • オープンソースではありません。

検索実装間の比較については、次のとおりです。

于 2012-10-23T09:14:26.447 に答える
2

全文検索を実行できるtsearch2列を含む検索テーブルを使用でき、名前と場所などに対してクエリを実行する必要があるすべての列を使用できます。

テーブルがすべて同じモデルから継承されている場合、検索テーブルでそれらを参照するのが簡単になります。そうでない場合は、コンテンツ タイプ テーブルを作成して、最終的にクエリの結果を取得できる結果行を参照するために検索テーブルで使用される一般的な外部キーを配置できます。表は、トリガーを使用して移入されます。特にSQL(おそらくPL/SQL)をよく知っている場合、これは最も効率的なソリューションかもしれません。

そうでない場合は、Luceneを使用して必要なインデックスを Java で作成し、必要に応じてクエリを実行することをお勧めします。

于 2012-10-20T04:32:34.537 に答える
1

多くの異なる要件があり、それらすべてを満たすソフトウェアはありません。

  1. カスタム検索構文
  2. 複数エンティティ検索
  3. 全文検索
  4. セマンティック検索 (?)

それらのすべてについて話しましょう。

カスタム検索構文

ユーザー入力に基づいて整形式のクエリを作成できるシステムが必要です。このシステムは、行うだけでなく管理します+metallica -bieber -> text CONTAIN metallica AND text NOT CONTAIN bieber

あなたの例は完全に正確ではありません。「場所: ロンドン」に基づいて、システムはどのように「アーセナル」を見つけることができますか? システムは「場所: ロンドン」に基づいて「Neil Christian」をどのように見つけますか?

解決策: Lucene のようなシステムが検索クエリで豊富な構文をサポートしていると確信しています。ただし、それはフレームワークの構文であり、独自のものではありません。独自の構文を指定するのは難しいことに注意してください。レクサー、パーサー、および検索フレームワークのクエリ ツリーへの独自の翻訳を構築する必要があります。

複数エンティティ検索

一度に複数のエンティティを検索する必要があります。これは、検索フレームワークでは問題ありません。

ただし、検索構造を定義し、これをエンティティにリンクする必要もあります。これは少し難しくなりますが、不可能ではありません。

全文検索

これも非常に簡単です。

セマンティック検索

高度な検索フレームワークは、セマンティック検索をサポートする必要があります (たとえば、 LondonはQueenに関連しています。これは、一部のテキストで頻繁に一緒に出現するためです)。ただし、これはトレーニング データセットに依存する場合があります。

結論

難しいのは継承でも全文検索でもない。ただし、データの照合方法を実際に定義する必要があります。Google がそのように見せかけるかもしれませんが、検索システムは魔法のようなものではありません。検索は実際の数学に依存します。これをさらに進める前に、構文でこれらの数学的規則を指定する必要があります。

于 2012-10-23T19:22:59.857 に答える
1

ネイティブの全文実装でデータベースを使用していないと仮定しているため、これは貧しい人のソリューションですが、Lucene などの本格的なソリューションに行く前に何かを配信するためのものです。より長い学習時間が必要になる場合があります。

これらすべての異なるテーブルからすべてのデータを取得し、すべての結合なしで検索を実行できる「インデックス」テーブルにそれらをダンプするために、スケジュールされたプロセスを時々実行するだけです。

次のようなテーブルを持つことができます。

eventId - int
keywords - nvarchar(max)
location - nvarchar
start_date - datetime
end_date - datetime

このようにして、検索を実行するために必要なすべてを 1 か所で入手できます。検索自体については、クエリで like 演算子を使用すると、適切な結果が得られる可能性があります。

男性が夢見ることができる最高の検索プラットフォームではありませんが、数時間で機能するものです.

于 2012-10-23T11:53:44.153 に答える
-1

SQLite はフルテキスト インデックスをサポートしています。

http://sqlite.org/fts3.html

于 2012-10-14T12:07:56.427 に答える