ウェブサイトでの検索には、neo4j暗号クエリを使用しています。したがって、クエリの最適化を除いて、長いすべてがうまくいっています。検索結果を取得していますが、サイファークエリに関する経験と完全な知識が不足している可能性があります。
テキストボックスでは、検索文字列がキーアップハンドラーでクエリに送信されます。これは、各文字を入力すると、クエリを実行することを意味します。例えばのように。v次に、このように、スペースに入るまで、それを1つの文字列として扱い、結果がそれに応じて表示されますが、問題は、スペースに入ると文字を書き始め、再び文字列を形成するため、結果が大きく変動します。
例:
クエリ1:
MATCH (n:user)<-[:userinteresttag]-(tag) where ANY(m in split(n.username," ") where m STARTS WITH 'vartika' ) RETURN distinct n.username
QUERY2: MATCH (n:user)<-[:userinteresttag]-(tag) where ANY(m in split(n.username," ") where m STARTS WITH 'vartika' or m STARTS WITH 'jain') RETURN distinct n.username order by n.username
問題:-区切り文字ではなく完全な文字列で検索を表示しているので、画像で確認できるように、最初の結果として来ると予想されるvartika jainが2に移動しますが、そうではないはずです。
キーアップハンドラーで作業すると、検索結果のvartikajainが最後の位置に移動します。これは不要です。
質問:-それで、結果を最適化する方法はありますか?それにより、グーグル検索で得られる最高の結果を得ることができます。
マッチの数を数えて、それで並べ替える必要があるようです。
MATCH (n:user)
WITH n, size([m in split(n.username, ' ') WHERE m STARTS WITH 'vartika' OR m STARTS WITH 'jain']) AS matches
RETURN n.username
ORDER BY matches DESC
クエリで使用していないため、[:userinteresttag]
リレーションシップとtag
ノードを削除しました。
ムービーグラフの例:
MATCH (p:Person)
WITH p, size([x IN split(p.name, ' ') WHERE x STARTS WITH 'Tom' OR x STARTS WITH 'Hanks']) AS matches
RETURN p.name, matches
ORDER BY matches DESC
LIMIT 5
╒════════════╤═══════╕
│p.name │matches│
╞════════════╪═══════╡
│Tom Hanks │2 │
├────────────┼───────┤
│Tom Cruise │1 │
├────────────┼───────┤
│Tom Skerritt│1 │
├────────────┼───────┤
│Tom Tykwer │1 │
├────────────┼───────┤
│Keanu Reeves│0 │
└────────────┴───────┘
ただし、実際には、名前と姓を別々のプロパティに保存し、インデックスを付けて、STARTS WITH
それらのインデックス付きプロパティで使用する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加