2009-03-18 11 views
0

私の質問に答えられないので、この質問を再度投稿しています。MultiFieldQueryParserが頭字語からドットを削除しています

Luceneを使用して書籍検索apiで作業しています。 タイトルまたは説明フィールドにC.F.Aが含まれている書籍を検索できます。 StandardAnalyzerとストップワードのリストを使用しています。

上記の解析にMultiFieldQueryParserを使用していますが、構文解析後に文字列のドットを削除しています。私はここで何が欠けていますか?

ありがとうございました。

答えて

1

(私はJavaのLuceneの持つ唯一の馴染みだけど、私はそれが、この場合には重要ではありませんことを想像してください。)

アナライザーの目的は、効果的な全文検索を防ぎ、文字や書式を剥ぎ取ることです。たとえば、luceneのみを "lucene.net"と呼ぶ文書を書く場合、luceneが "lucene"だけの検索ヒットを返すようにしたいと思うでしょう。したがって、StandardAnalyzerはドット(およびその他の特殊文字)を取り除きます。

心配しないでください。いつものように、これは構成することができます。この場合は、別のアナライザーを選択します。 SimpleAnalyzerまたはKeywordAnalyzerを代わりに使用し、どちらが目的の動作に最も近いかを確認してください。どちらも実行しない場合は、アナライザインターフェイスを使用して独自のカスタムアナライザを実装することもできます。実際には非常に簡単です。

幸運。 :)

7

あなたが言及したように、これはthis questionの欺瞞です。私は少なくともあなたの質問にそれへのリンクを追加することをお勧めします。また、ユーザーアカウントを作成することを強くお勧めします。今は古い質問を見てコンテキストを取得することができないからです。

具体的には、StandardAnalyzerは頭字語を扱い、C.F.A.を変換します。 (たとえば)cfaに転送します。つまり、インデックス作成とクエリの解析に同じアナライザを使用することを確認している限り、検索を実行できるはずです。

他の要因を排除するために、さらに基本的なテストケースを実行することをお勧めします。マルチフィールドの代わりに普通のQueryParserを試してみてください。ここで

は、私はと遊ぶために書いたいくつかのコードです StandardAnalyzer

StringReader testReader = new StringReader("C.F.A. C.F.A word"); 
StandardAnalyzer analyzer = new StandardAnalyzer(); 
TokenStream tokenStream = analyzer.tokenStream("title", testReader); 
System.out.println(tokenStream.next()); 
System.out.println(tokenStream.next()); 
System.out.println(tokenStream.next()); 

方法によって、このため出力があった:

(cfa,0,6,type=<ACRONYM>) 
(c.f.a,7,12,type=<HOST>) 
(word,13,17,type=<ALPHANUM>) 

注意は、例えば、という頭字語は、「doesnの場合最後にドットで終わると、アナライザはインターネットホスト名とみなします。したがって、 "CFA"を検索すると "CFA"と一致しませんテキストで。

関連する問題