2

Lucene では、インデックス作成と検索に SnowballAnalyzer を使用しています。

インデックスを構築したら、インデックスに対してクエリを実行します。たとえば、「本文」フィールドに「特化」したクエリを作成します。IndexSearcher は、「specialize、specialized など」を含むドキュメントを返します。SnowballAnalyzer によってステミングが行われるためです。

今 - トップドキュメントを持っている - 私は本文フィールドからテキストスニペットを取得したい. この切り取りには、クエリ ワードの語幹バージョンが含まれている必要があります。
たとえば、返されたドキュメントの 1 つに body フィールドがあります。いつでも利用できます。」次に、「これらの場合、視覚に特化したサービス」の部分をスニペットとして取得したいと思います。さらに、このスニペットの用語が必要です。それを行うコードですが、「?」とマークされたコードがあります。質問があるキャラクターは次のとおりです。

私がやりたい方法は IndexReader ir = IndexReader.open(fsDir);
TermPositionVector tv = (TermPositionVector)ir.getTermFreqVector(hits.scoreDocs[i].doc, "body");

? - ここ: クエリ - クエリは用語でなければなりません。したがって、実際のクエリが「特殊化」されている場合、クエリは特殊化されている必要があります。これは通常、スノーボール アナライザーが行うことです。クエリには「specialized machines」というフレーズを含めることができるため、単一の単語またはフレーズについてアナライザーによって分析された用語を取得するにはどうすればよいですか。

int idx = tv.indexOf(query);
int [] idxs = tv.getTermPositions(idx);
for(String t : tv.getTerms()){
int iidx = tv.indexOf(t);
int [] iidxs = tv.getTermPositions(iidx);
for(int ni : idxs){
tmpValue = 0.0f;
for(int nni : iidxs){
if(Math.abs(nni-ni)<= Settings.termWindowSize){

編集
語幹語を取得する方法を見つけました:
Query q = queryParser.parse("some text to be parsed"); String parsedQuery = q.toString();
Query オブジェクトtoString(String fieldName)のメソッドがあります。

4

1 に答える 1

0

いくつかの質問が混在していると思います。まず、クエリの語幹バージョンとその他の有用な情報を表示するには、IndexSearcher の Explain() メソッドを使用できます。この質問に対する私の回答をご覧ください。

スニペットを取得するための Lucene ソリューションはHighlighterです。別のオプションはFastVectorHighlighterです。両方をカスタマイズして、完全な用語ではなく語幹を取得できると思います。

于 2010-11-21T09:33:55.573 に答える