lunrステマーのパイプライン機能として実装されている: は、以下のコードのサンプルです。パイプライン機能は、ドキュメントを索引付けするときにドキュメント内の各単語、および検索時に検索クエリ内の各単語に対して実行されます。
パイプラインで機能するためには、非常に単純なインターフェイスを実装する必要があります。入力として単一の文字列を受け入れる必要があり、文字列を出力として応答する必要があります。
ので非常にシンプル(と役に立たない)パイプライン機能は、次のようになります。
var simplePipelineFunction = function (word) {
return word
}
実際に我々は二つのことを行う必要があり、このパイプライン機能を利用するには:
- これをパイプライン関数として登録すると、lunrはパイプラインを正しくシリアライズおよびデシリアライズできます。
- インデックスパイプラインに追加します。このようなものになります
:今
// 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のデフォルト言語は英語です。したがって、デフォルトでは、英語に特化したパイプライン関数が含まれています。英語とギリシャは、おそらく英語のデフォルト値を持つインデックスギリシャ語の単語をしようとして問題に実行されることを十分に異なっているので、我々は次の操作を行う必要があります。
- は、私たちの言語固有ステマー
- 削除してデフォルトのステマーを交換してください非ラテン文字でうまく動作しないデフォルトのトリマー
- デフォルトのストップワードフィルターを置き換えて削除します。英語以外の言語ではあまり使用されないでしょう。
トリマーとストップワードフィルターはパイプライン関数として実装されているため、言語固有のものを実装すると、ステマーにとって似ています。
だから、ギリシャのため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にあります。ほとんどの言語処理関数では、これは問題ではありません。実際、ほとんどの場合、単語は小文字であると想定しています。この場合、ギリシャ語のステマーは、ギリシャ語のステミングの複雑さのために、大文字の単語のみを派生させます(私はギリシャ語のスピーカーではないので、ステミングがどれほど複雑であるかについてはコメントできません)。 ソリューションは、ギリシャ語のステマーを呼び出す前に大文字に変換してから、パイプラインの残りの部分にトークンを渡す前に小文字に変換し直します。
Githubリポジトリに問題として投稿することをお勧めします。 – MEGADEVOPS