私はエラスティック検索を初めて使用します。これが私が解決しようとしているシナリオです。自動提案ロジックをサポートする検索入力ボックスがあります。結果は、ngram フィルターを使用するエラスティック インデックスからフェッチされます。私が改善したいのは、スコアリング機能を導入して、結果を最も重要なものから重要度の低いものに並べることです (スコアに応じて)。スコアは、次のケースに基づいている必要があります。
- 指定した文字列で始まる一致があった場合、スコアを 100 に設定します
- 指定された文字列を含み、それで始まらない一致がある場合、スコアを 10 に設定します。
この目的のために、正規表現の一致をサポートするために、エラスティカ スクリプトが mvel ステートメントで実装されました。つまり、左側の値が右側の正規表現と一致するかどうかを確認します (その場合にのみ、それに応じて変数がインクリメントされます)。しかし残念ながら、左側の値も指定された言語のものであるにもかかわらず、検索文字列が言語固有である場合はうまくいきません。対処すべきもう 1 つの問題は、上記で言及した 2 番目のケースです (機能しない)。
指定された単語 ('one') で始まる値 ('one example' (名前フィールドに属する)) のスクリプトは問題なく動作します。
$testParam = mb_strtolower('one', 'utf-8');
$regexStart = '^' . $testParam . '.*$';
$ElasticaScript = new Elastica_Script(" total = 1; if(doc['name'].value ~= '{$regexStart}'){ total += 100; } return total; ");
値 ('one example' (名前フィールドに属する)) に指定された単語 ('example') が含まれている場合のスクリプトが機能せず、その結果、合計スコアが 1 のままになり、本来あるべき 11 に増加しません。
$testParam = mb_strtolower('example', 'utf-8');
$regexStart = '^.*' . $testParam . '.*$';
$ElasticaScript = new Elastica_Script(" total = 1; if(doc['name'].value ~= '{$regexStart}'){ total += 10; } return total; ");
最後に、同じロジックで、名前フィールドの値 (ギリシャ文字を含む) に対してギリシャ語の単語を照合しようとすると、合計スコアの増分も無視されます。
すべての作業は、php はもちろん、エラスティカを使用して行われました。私の問題を解決するのを手伝ってくれませんか? 別のアプローチ/解決策がある場合は、遠慮なく私と共有してください。
前もって感謝します