2009-10-21 21 views
6

入力文字列にC++のような用語が含まれている場合、luceneが関連する検索結果を返すようにするにはどうすればよいですか? Luceneは++文字を無視しているようです。Lucene検索での特殊文字としての取り扱い

コードの詳細: この行を実行すると、空の検索クエリが表示されます。

queryField = multiFieldQueryParser.Parse(inpKeywords); 

keywordsQuery.Add(queryField, BooleanClause.Occur.SHOULD); 

そして、ここに私のカスタムアナライザです:私はQUERYFIELD = multiFieldQueryParser.Parse(QueryParser.Escapeを試してみました

indexSearcher.Search(searchQuery, collector); 

public class CustomAnalyzer : Analyzer 
    { 
     private static readonly WhitespaceAnalyzer whitespaceAnalyzer = new WhitespaceAnalyzer(); 
    public override TokenStream TokenStream(String fieldName, System.IO.TextReader reader) 
     { 
      TokenStream result = whitespaceAnalyzer.TokenStream(fieldName, reader); 
      result = new StandardTokenizer(reader); 
      result = new LowerCaseFilter(result); 
      result = new StopFilter(result, stop_words); 
      return result; 
     } 
} 

そして、私は、検索クエリをこのように実行しています(inpKeywords));しかし、それでも動作しません。ここで実行され、ゼロヒットを返すクエリです。 "+(())"

ありがとうございます。

答えて

3

で説明したように

あなたは、これを有効にすることができます。エスケープする必要があるすべての文字のリストはhereです(ページの下部を参照)

また、インデックス作成中に使用するアナライザーには注意が必要です。たとえば、StandardAnalyzerは+をスキップします。索引付けと検索の際にWhiteSpaceAnalyzerのようなものを使う必要があるかもしれませんが、これはトークンストリーム内の特殊文字を保存します。インデックス作成と検索の際には、同じアナライザを使用する必要があることに注意してください。

+0

....動作していません私の更新された質問に。 –

0

検索クエリをUTF-8でエンコードしてみてください。 、+は特殊文字、それはエスケープする必要があるのでthis article

+0

リンクはWhiteSpaceAnalyzerを使用しています...が、それでも+文字を参照してくださいウルanswer.Pleaseため – Nirmal

1

適切なアナライザーを選択するだけでなく、QueryParser.Escape(string s)を使用して、すべての特殊文字が正しくエスケープされるようにすることができます。

これは静的関数であるため、MultiFieldQueryParserを使用していても使用できます。

たとえば、あなたがこのような何かを試すことができます。

queryField = multiFieldQueryParser.Parse(QueryParser.Escape(inpKeywords)); 
+0

感謝を無視している –

+0

また、Jesse.IはqueryField = multiFieldQueryParser.Parse(QueryParser.Escape(inpKeywords));試しましたが、それでも動作しません。 実行され、ゼロヒットを返すクエリです。 "+(())" –

+0

ちょっとエド、エスケープ機能のない単純なキーワードでも機能しますか?もしそうなら、恐らくあなたのSearcherとQueryParserオブジェクトに関連するより多くのコードを投稿してください。また、インデックス作成に使用するアナライザーと同じアナライザーで検索する必要があります。 – Jesse

関連する問題