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)のメソッドがあります。