2017-01-11 14 views
0

Luceneインデックスでいくつかのクエリを実行していますが、今はこのクエリでラテン語のフレーズを探しています。問題は、このフレーズの中には、ストッパーのように思えるものが含まれていることがあります。たとえば、検索用語が「contrario sensu」の場合、結果はゼロですが、「contrario sensu」のみを検索すると、100を超える偶然があります。Luceneインデックスストッパーなしで検索

質問はどうやってこの栓抜きで検索できますか?

私のコードは、私はそれがストップワードであるインデックスを構築し、検索

答えて

0

を実行するためにStandardAnalyzerを使用して、この

public IEnumerable<TesisIndx> Search(string searchTerm) 
{ 
     List<TesisIndx> results = new List<TesisIndx>(); 

     IndexSearcher searcher = new IndexSearcher(FSDirectory.GetDirectory(indexPath)); 
     QueryParser parser = new QueryParser("Rubro", analyzer); 


     PhraseQuery q = new PhraseQuery(); 
     String[] words = searchTerm.Split(' '); 

     foreach (string word in words) 
     { 
      q.Add(new Term("Rubro", word)); 
     } 

     //Query query = parser.Parse(searchTerm); 
     Hits hitsFound = searcher.Search(q); 

     TesisIndx sampleDataFileRow = null; 

     for (int i = 0; i < hitsFound.Length(); i++) 
     { 
      sampleDataFileRow = new TesisIndx(); 
      Document doc = hitsFound.Doc(i); 
      sampleDataFileRow.Ius = int.Parse(doc.Get("Ius")); 
      sampleDataFileRow.Rubro = doc.Get("Rubro"); 
      sampleDataFileRow.Texto = doc.Get("Texto"); 


      results.Add(sampleDataFileRow); 
     } 
} 

のように見えます。ただし、フレーズクエリについて言えば、それは全く考慮されていません。 「?contrario sensuの」

その疑問符は、この場合には、取り外しストップワードを位置増分を表します

Rubro:あなたが解析した後、あなたのクエリを印刷しようとした場合、あなたは次のように表示されるはずです。それで、冒頭で停止単語が削除された隙間のあるフレーズを探しています。

QueryParser.setEnablePositionIncrements(false)を使用してクエリパーサーで位置増分を無効にすることはできますが、インデックスに位置増分があり、フレーズの途中で停止語を実行すると問題が発生する可能性があることに注意してください。

+0

構文解析後にクエリを印刷すると、Rubro: "contrario sensu"と表示されるので、少なくともその時点で停止語は削除されていません。私はまた、位置の増分をfalseに設定しますが、何も変わりません。 –

+0

@danilo_zac - あなたはあなたのアナライザをどのように定義するかを示していません。あなたはそれに空のストップセットやそのようなものを与えていますか? – femtoRgon

+0

私はアナライザーを定義するためにこのようなことをやっています。Analyzer analyzer = new StandarAnalyzer(); –

0

StandardAnalyzerは「A」を含むストップワードのセットを除外します(完全なリストについては、https://github.com/apache/lucenenet/blob/3.0.3-2/src/core/Analysis/StopAnalyzer.csの末尾を参照)

照会、分析スタイルが使用されたスタイルと互換性があることが重要ですインデックス作成。これは、あなたのPhraseQueryがを除いてのみ動作する理由です。なぜなら、インデックス作成ステップによってそれが削除されたからです。

あなたはISet<string> stopWordsを取るStandardAnalyzerのctorのを使用するなどnew HashSet<string>()何かに渡すことができます。これは、すべての言葉がフィールドのトークンストリームに含まれることを意味

new StandardAnalyzer(Version.LUCENE_30, new HashSet<string>()) 

インデックス作成とクエリの際にこのアナライザを使用すると、より良い結果が得られます。

ただし、StandardAnalyzerも単語を多少試していることに注意してください。これは、「ほとんどのヨーロッパ言語の文書に適したトークナイザ」として設計されています。さらに詳しい情報については、https://github.com/apache/lucenenet/blob/3.0.3-2/src/core/Analysis/Standard/StandardTokenizer.csの冒頭にあるコメントを参照して、ユースケースと互換性があるかどうかを確認してください。

インデックス作成するテキストの種類によって、さまざまなアナライザを調べるのは時間がかかることがあります。