アポストロフィ検索を使用して部分的な文字列一致の検索を実行するために使用できる設定 (またはスニペット) はありますか? 例: 「青」を検索すると、タイトルが「Learning Management Blueprint」のアイテムが返されます。
2 に答える
ご存じのとおり、私は P'unk Avenue で Apostrophe の主任開発者を務めています。
あなたの解決策は機能しますが、深刻な問題の 1 つは、ユーザーの入力をエスケープして、のような正規表現のメタ文字がそのよう.
に*
解釈されないようにすることです。そのために、 を使用apos.utils.regExpQuote(s)
して危険な文字をエスケープした文字列を返します\
。
ただし、これを行うためのより良い方法がありますreq.query.autocomplete
。代わりに使用してください。アポストロフィには、autocomplete
フィルターとは異なる動作をする組み込みのカーソル フィルターがありsearch
ます。フィルターは部分一致を許可し(ただし、単語の先頭のみ)、結果が一致の質によってソートされるようにautocomplete
、通常の検索で見つかった単語をフィードします。search
また、 を使用することによるパフォーマンス上の利点の多くが維持されsearch
ます。
あなたのような正規表現検索は、mongodb コレクション全体 (まあ、少なくとも関連するタイプのすべてのドキュメント) をスキャンします。つまり、コンテンツが多い場合、パフォーマンスの問題が発生します。
1 つの注意点は、タイトル、タグなどの優先度の高いフィールドの単語のみを「見る」ことです。正規表現検索 (またはフィルター)autocomplete
のようにドキュメントの全文を表示するわけではありません。search
これは、パフォーマンスを維持するために必要なトレードオフでした。
RegExp を追加する必要があるようです。他の誰かがこれを必要とする場合のために、関連する lib\modules\apostrophe-search\index.js コードを次に示します。
module.exports = {
perPage: 15,
construct: function(self, options) {
self.indexPage = function(req, callback) {
req.query.search = req.query.search || req.query.q;
var allowedTypes;
var defaultingToAll = false;
var cursor = self.apos.docs.find(req, { lowSearchText: new RegExp(req.query.search, 'i') } )
.perPage(self.perPage);
if (self.filters) {
var filterTypes = _.filter(
_.pluck(self.filters, 'name'),
function(name) {
return name !== '__else';
}
);