2

Rails アプリで Neo4j を使用する。

ユーザー生成コンテンツの長い文字列を含むいくつかの文字列プロパティを持つノードがあります。たとえば、タイプが「Book」のノードには、長い形式の文字列値を含むプロパティ、「review」、および「summary」があるとします。

これらのプロパティに一致するノードを、ユーザーが検索ボックスに入力した一般的な言語の検索用語に返すクエリを設計しようとしていました。クエリがますます複雑になるにつれて、自然言語検索を解決しようとしていることに気づきました。

Rails で人気のある検索ジェムをいくつか調べてみましたが、それらはすべて ActiveRecord に依存しているようです。Neo4j.rb にはどのような検索ソリューションがありますか?

4

2 に答える 2

2

これにはいくつかの方法があります。

FrobberOfBits が言ったように、Neo4j には「レガシー インデックス」と呼ばれるものがあり、バックグラウンドで Lucene を使用して一般的なもののインデックスを作成します。新しいスキーマ インデックスはサポートしています。残念ながら、これらは完全一致に基づいています (ただし、Neo4j 2.3.x では多少変更されると確信しています)。

Neo4j は、=~演算子による文字列のパターン マッチングをサポートしていますが、これらのクエリはインデックス化されていません。したがって、パフォーマンスはデータベースのサイズによって異なります。

searchkickモデルでElasticsearchのインデックスを定義できるgemをよくお勧めします。次に、検索を行うメソッドを呼び出すだけで、Model.search最初に Elasticsearch にクエリを実行してノード ID を取得し、Neo4j.rb を介してそれらのノードをロードします。neo4j-searchkickgem経由で使用できます: https://github.com/neo4jrb/neo4j-searchkick

最後に、NLP を行っていて、テキストから重要な単語を抽出しようとしている場合は、Tag/Wordラベルを作成し、ノードからこれらの NLP 抽出ノードへの関係を作成して、後でそれらのノードに基づいて検索できるようにすることができます。共通のタグ ノードの数/タイプに基づいて、あるテキスト ノードから別のテキスト ノードへの推奨事項を作成することもできます。

于 2015-10-08T20:02:10.183 に答える
0

neo4j.rb と activerecord に特定のものが存在するかどうかはわかりません。私が言えることは、一般に、このようなものはLucene によって実装されているレガシー インデックスを使用して処理されるということです。

前提として、特定のプロパティで lucene が管理するインデックスを作成すると、cypher を介して Lucene クエリ言語を使用してそれらのインデックスからデータを取得できるようになります。neo4j.rb と比較すると、次のようにcypher クエリを実行するのと同じように見えます。

START item=node:node_auto_index("(title:'foo bar' AND body:baz*) OR title:'bat'")
RETURN item

lucene インデックスとそのクエリ言語は、STARTブロックではなくブロックでのみ使用できることに注意してくださいMATCHLucene Query Syntaxを参照して、そのクエリ構文 (ファジー マッチング、ワイルドカードなど - 正規表現よりもかなり広範囲) で何ができるかを確認してください。

于 2015-10-08T17:06:55.587 に答える