ゲーム用の検索エンジンを構築しています (path of exile)。このゲームでは、アイテムにはソケットがあります。
- アイテムは 0 から 6 のソケットを持つことができます
- 一部のソケットはリンク可能
- ソケットは3種類(赤・緑・青)
- 3 つのソケットがリンクされている場合 (たとえば)、最も近いソケットだけでなく、すべてが相互にリンクされていると見なされます。
5 つのリンクされたソケットと 1 つの孤独な 6 番目のソケットを持つアイテムの例。
私の目標は、ユーザーが特定のソケットの色と ElasticSearch とのリンクを持つアイテムを検索できるようにすることです。
ユーザーはソケットの組み合わせを次のように説明します。
「RRRBB」は赤3個、青2個のソケットが5個連結した商品になります。「GGG RB」には、3 つの緑のソケットがリンクされ、1 つの赤と 1 つの青のソケットがリンクされます。
まだフォローしていますか?
アイテムにインデックスを付けるとき、リンクされたソケットをアルファベット順およびグループ サイズ (グループ サイズは必要ない場合があります) で並べます。「RB GGB」は「BGG RB」になります。
そして、検索を行う前に、同じ方法でユーザー入力を並べ替えます。
したがって、正確な組み合わせを検索するのは非常に簡単で高速です(?)。データを分析する必要すらありませんよね?
しかし、これらのシナリオが機能することを望みます:
「ggg」は「ggg rb」を検索します -> これは空白アナライザーだけで簡単ですか?
しかし、私が苦労しているのは次のとおりです。
"brr* r b" は "bgrr r b" と一致します -> 私が現在行っている方法: グループに * があるとすぐに、すべてのサブグループの間に * を追加するので、次のように検索します: b g* r b . うまくいきますが、本当に非効率だと思いますよね?(最初と最後の文字が B または R の場合、最初と最後の * を削除するなどの小さな最適化を行っても)。
これを可能かつ高速にするために、データ(アナライザー、文字列または用語など)にインデックスを付ける方法についてのアイデアはありますか?
終わり。