3

タイトルの大きなリストを検索する必要があるアプリに取り組んでいます。理想的には NoSQL を使用したいのですが、データベース全体でのテキスト検索は SQL データベースほど良くないようです (間違っている場合は修正してください)。

いずれにせよ、検索速度を最適化したいのです。通常の検索でも十分速いかもしれませんが、レスポンシブなライブ検索とファジー検索が必要です。したがって、私は2つのアプローチしか考えられません:

  1. タイトルのリスト全体をメモリにロードし、トライまたはプレフィックス ツリーとしてインデックスを作成します

  2. mapreduce 関数を使用して、ある種のトライ アルゴリズムを実装します。これは好ましい解決策ですが、実行できるかどうか、またはディスク容量のコストが利点を上回る可能性があるかどうかはわかりません.

何か案は?また、「あいまい検索」がトライと B+ ツリーのどちらで実装するのが最適かはわかりません。

「タイトル」がユニークなので。完全なタイトルを ID として使用する必要がありますか?

4

1 に答える 1

3

これを効率的に行うには、テキストを単語ごとに索引付けする必要があります。

fooつまり、資格のあるオブジェクトMapReduce: Simplified Data Processing on Large Clustersは次のキーにマップされます。

  • MapReduce: Simplified Data Processing on Large Clusters
  • Simplified Data Processing on Large Clusters
  • Data Processing on Large Clusters
  • Processing on Large Clusters
  • on Large Clusters
  • Large Clusters
  • Clusters.

テキストが長すぎる場合は、キーを特定の文字数 (たとえば24) に切り詰めることができます。

CouchDB のコード サンプルは次のとおりです。

function map(o) {
  const SIZE = 24;
  function format(text, begin) {
    return text.substr(begin, SIZE).toLowerCase();
  }
  const WORD_MATCHER = /\S+/g;
  while ((match = WORD_MATCHER.exec(o.title))) {
      var begin = match.index;
      emit(format(o.title, begin), {position: begin});
  }
}

次に、 と の間のキーを要求するdata processdata processZ、次のようになります。

{"key": "data processing on large clusters", "id": "foo", "value":{"position": 22}}
于 2013-03-11T13:27:32.673 に答える