2016-09-06 13 views
0

ギリシャ語のlunrに新しい語幹関数を登録すると、期待通りに機能しません。 hereはcodepenの私のコードです。私はエラーを受け取っていませんが、別途使用すると関数stemWord()はうまく動作しますが、lunrの単語を分断できません。lunr.jsのギリシャ語サポート

function stemWord(w) { 
// code that returns the stemmed word 
}; 

// create the new function 
greekStemmer = function (token) { 
    return stemWord(token); 
}; 

// register it with lunr.Pipeline, this allows you to still serialise the index 
lunr.Pipeline.registerFunction(greekStemmer, 'greekStemmer') 

    var index = lunr(function() { 
    this.field('title', {boost: 10}) 
    this.field('body') 
    this.ref('id') 

    this.pipeline.remove(lunr.trimmer) // it doesn't work well with non-latin characters 
    this.pipeline.add(greekStemmer) 
    }) 

    index.add({ 
    id: 1, 
    title: 'ΚΑΠΟΙΟΣ', 
    body: 'Foo foo foo!' 
    }) 

    index.add({ 
    id: 2, 
    title: 'ΚΑΠΟΙΕΣ', 
    body: 'Bar bar bar!' 
    }) 


    index.add({ 
    id: 3, 
    title: 'ΤΙΠΟΤΑ', 
    body: 'Bar bar bar!' 
    }) 
+1

Githubリポジトリに問題として投稿することをお勧めします。 – MEGADEVOPS

答えて

1

lunrステマーのパイプライン機能として実装されている: は、以下のコードのサンプルです。パイプライン機能は、ドキュメントを索引付けするときにドキュメント内の各単語、および検索時に検索クエリ内の各単語に対して実行されます。

パイプラインで機能するためには、非常に単純なインターフェイスを実装する必要があります。入力として単一の文字列を受け入れる必要があり、文字列を出力として応答する必要があります。

ので非常にシンプル(と役に立たない)パイプライン機能は、次のようになります。

var simplePipelineFunction = function (word) { 
    return word 
} 

実際に我々は二つのことを行う必要があり、このパイプライン機能を利用するには:

  1. これをパイプライン関数として登録すると、lunrはパイプラインを正しくシリアライズおよびデシリアライズできます。
  2. インデックスパイプラインに追加します。このようなものになります

:今

// registering our pipeline function with the name 'simplePipelineFunction' 
lunr.Pipeline.registerFunction(simplePipelineFunction, 'simplePipelineFunction') 

var idx = lunr(function() { 
    // adding the pipeline function to our indexes pipeline 
    // when defining the pipeline 
    this.pipeline.add(simplePipelineFunction) 
}) 

を、あなたは上記を取る、と私たちのパイプライン機能の実装を入れ替えることができます。英語以外の言語で動作するようにlunrを適応

var myGreekStemmer = function (word) { 
    // I don't know how to use the greek stemmer, but I think 
    // its safe to assume it won't be that different than this 
    return greekStem(word) 
} 

は単なる追加以上が必要ですので、だけではなく、言葉そのまま返すので、それはあなたが多分このように、言葉を食い止めるために発見したギリシャ語のステマーを使用することができますあなたのステムマー。 lunrのデフォルト言語は英語です。したがって、デフォルトでは、英語に特化したパイプライン関数が含まれています。英語とギリシャは、おそらく英語のデフォルト値を持つインデックスギリシャ語の単語をしようとして問題に実行されることを十分に異なっているので、我々は次の操作を行う必要があります。

  1. は、私たちの言語固有ステマー
  2. 削除してデフォルトのステマーを交換してください非ラテン文字でうまく動作しないデフォルトのトリマー
  3. デフォルトのストップワードフィルターを置き換えて削除します。英語以外の言語ではあまり使用されないでしょう。

トリマーとストップワードフィルターはパイプライン関数として実装されているため、言語固有のものを実装すると、ステマーにとって似ています。

だから、ギリシャのためlunrを設定するには、あなたがこの必要があります:いくつかのより多くのインスピレーションのために

var idx = lunr(function() { 
    this.pipeline.after(lunr.stemmer, greekStemmer) 
    this.pipeline.remove(lunr.stemmer) 

    this.pipeline.after(lunr.trimmer, greekTrimmer) 
    this.pipeline.remove(lunr.trimmer) 

    this.pipeline.after(lunr.stopWordFilter, greekStopWordFilter) 
    this.pipeline.remove(lunr.stopWordFilter) 

    // define the index as normal 
    this.ref('id') 
    this.field('title') 
    this.field('body') 
}) 

を使用すると、優れたlunr-languagesプロジェクトを見てとることができ、それはlunrのための言語拡張を作成するための多くの例があります。あなたはギリシャ語にも提出することができます!私も、私が思ったようlunr.Pipeline APIを知らないよう

EDITではなく、我々はそれを削除し、その後削除する関数の後に交換を挿入し、そして、何replace機能はありません、ルックス。

EDIT今後これを他の人に手助けするために追加する...問題は、lunr内のトークンのケーシングにまで下がっていたことが判明しました。 lunrは、すべてのトークンを小文字として扱いたいと考えています。これは、設定可能性がなく、tokenizerにあります。ほとんどの言語処理関数では、これは問題ではありません。実際、ほとんどの場合、単語は小文字であると想定しています。この場合、ギリシャ語のステマーは、ギリシャ語のステミングの複雑さのために、大文字の単語のみを派生させます(私はギリシャ語のスピーカーではないので、ステミングがどれほど複雑であるかについてはコメントできません)。 ソリューションは、ギリシャ語のステマーを呼び出す前に大文字に変換してから、パイプラインの残りの部分にトークンを渡す前に小文字に変換し直します。

+0

私の質問を編集しました。コードをご覧ください。ステマー自体は機能しますが、lunr.jsファイルでこれを置き換えようとすると機能しません。 –

+0

正確には動作しません。あなたはどんなエラーを出していますか?その情報なしでは少し難しいです。 –

+0

私は使用しているコードで質問を更新しました。間違いはありませんが、言葉が逸脱していないようです。あなたはコードを見て、それが正しいかどうか教えてください。また、私はこの事をデバッグする方法はありますか? console.logのようにlunrが最後に検索した単語は? –

関連する問題