FASTでドキュメント処理を設定する

サードパーティの検索エンジンをシステムに統合するときのタスクの1つは、ソースドキュメントの処理(大まかに言えば、インデックス作成)のプロセスを構成することです。 このようなプロセスのセットアップの複雑さは、検索システムの機能要件と検索エンジンの機能に依存します。 設定は、検索エンジンの管理パネルでの数回のクリックに制限することも、独自の手順、スクリプトなどを作成することもできます。 システムの標準機能を信頼することに慣れている場合(特にそのコードを変更できない場合)、独自のスクリプトについては、エンジンによって実装が常に提供されるとは限らないテストが必要です。



MS FAST ESP 5.3プラットフォームで検索を実装する必要に直面しました。 この真面目なエンジンには、ドキュメント処理をカスタマイズするための印象的な機能があり、その一部はプロジェクトで触れました。 一般に、このエンジンでカスタムステージをテストする方法を共有します。



ドキュメントは、ステージを作成するプロセスを非常によく説明しています。 私たちはそれを言い直さず、前述を理解するために必要な情報のみに限定します。

FAST ESPの用語では、単一のドキュメントのインデックス作成時に実行する必要のある一連のアクション全体をパイプラインと呼び、個々のアクションをステージと呼びます。 ステージは、対話できる特定のコンテキストで開始され、その要素の1つはドキュメントです。 たとえば、ステージは処理されたドキュメントの属性を読み書きできます。 概略的に、ドキュメントを処理するプロセス全体は次のようになります。







ステージは、xml仕様と実装(FAST ESP 5.3では、Python v.2.3言語の使用を提供する)の2つのファイルの形式で提示されます。



以下は、hotornew document属性がtrueの場合に品質フィールドに500を書き込むステージの例です。

 <プロセッサー>
  <プロセッサー>
   <ロードモジュール= "processors.SetOnEqual"クラス= "SetOnEqual" />
   <desc> HotOrNew = yesのドキュメントに高いランクを設定します
   </ desc>
   <構成>
         <param name = "Input" value = "hotornew" type = "str" />
         <param name = "Output" value = "quality" type = "str" />
         <param name = "InputFieldValue" value = "true" type = "str" />
         <param name = "OutputFieldValue" value = "500" type = "int" />
        
   </ config>
   <ops>
     <追加/>
   </ ops>
  </プロセッサ>
 </プロセッサ>


(仕様は、写真の完全性のために、テストに直接関与していません)



from docproc import Processor, DocumentException, ProcessorStatus class SetOnEqual(Processor.Processor): def ConfigurationChanged(self, attributes): self.input = self.GetParameter('Input') self.output = self.GetParameter('Output') self.inputfieldvalue = self.GetParameter('InputFieldValue') self.outputfieldvalue = self.GetParameter('OutputFieldValue') def Process(self, docid, document): testField = str(document.GetValue(self.input, None)) if testField == str(self.inputfieldvalue): output = int(self.outputfieldvalue) document.Set(self.output,output) else: document.Set(self.output, 0) return ProcessorStatus.OK
      
      





ドキュメント処理のネイティブコンテキストで作成されたステージの動作を検証するには、ドキュメントに示されている一連のアクションを実行する必要があります。

1.仕様ファイルと実装ファイルを特定のディレクトリに配置します。

2.ドキュメント処理サービスを再起動します-ドキュメントプロセッサ(procserver。開始時にステージコードをコンパイルします)。

3.パイプラインに新しいステージを含めます。

4.テストドキュメントのインデックスを作成します。

5.ドキュメントの処理結果を確認します(ログファイルに表示するか、標準のフロントエンドから新しいドキュメントを「検索」して、ドキュメントのすべての属性を表示できます)。



期待どおりの結果が得られなかった場合(たとえば、ドキュメントでフィールドhotornew = trueを設定しても、Qualityフィールドの値は変更されていない場合)、デバッグを行う必要があります。

-procserver'aのログでエラーを探します。

-テストされたステージを実行する前と実行した後、スパイステージを配置して、ステージが彼に求められたことを具体的に実行したかどうかを確認します。 (Spyはドキュメントダンプとその属性をディスク上のファイルにダンプします);

-ステージコードのエラーを検索します。



エラーが修正されたら、もう一度確認する必要があります-つまり 手順1、2、4、5を再度実行します。

退屈です。 ステージコードは、たとえば単体テストなどの通常の方法で「そのまま」デバッグする方が便利です。







したがって、コンテキストを「再作成」するために、ステージで動作するオブジェクトを使用してプリミティブなモカクラスを作成しました。



 class Document(object): """ Mock  Document """ def GetValue(self, name, default): return getattr(self, name, default) def Set(self, field, value): setattr(self, field, str(value)) class Processor (object): """ Mock  Processor """ def GetParameter(self, name): return getattr(self, name) def Set(self, field, value): setattr(self, field, str(value))
      
      





実際には、ドキュメントエンティティは他のメソッドを提供します。 使用するものに限定しました。

これで、検索エンジンなしでステージを記述/デバッグ/テストできます。



 import unittest import docproc.Processor as proclib from docproc import ProcessorStatus import SetOnEqual class testSetOnEqual(unittest.TestCase): def setUp(self): self.stage = SetOnEqual.SetOnEqual() self.stage.Set('Input', 'hot') self.stage.Set('Output', 'quality') self.assertEquals(self.stage.GetParameter('Input'), 'hot') self.assertEquals(self.stage.GetParameter('Output'), 'quality') def test_true(self): self.stage.Set('InputFieldValue', 'true') self.stage.Set('OutputFieldValue', '600') doc = proclib.Document() doc.Set('hot', 'true') self.stage.ConfigurationChanged('') status = self.stage.Process("docid", doc) self.assertEquals(status, ProcessorStatus.OK) self.assertEquals(doc.GetValue('quality', ""), '600') def test_false(self): self.stage.Set('InputFieldValue', 'true') self.stage.Set('OutputFieldValue', '600') doc = proclib.Document() doc.Set('hot', 'no') self.stage.ConfigurationChanged('') status = self.stage.Process("docid", doc) self.assertEquals(status, ProcessorStatus.OK) self.assertEquals(doc.GetValue('quality', ""), '0') def suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(testSetOnEqual)) return suite if __name__ == "__main__": unittest.main()
      
      





コード全体がアーカイブにあります



このアプローチがもたらしたもの:

-自分自身の生活の簡素化(多くの時間を節約し、単体テストの実践から逸脱しないようにします);

-テスターの生活の簡素化。



投稿者

リア・シャバカエワ

リード開発者

ソフトライン開発部



All Articles