2009-10-21 28 views
6

Girdi dizgim C++ gibi terimler içerdiğinde, lucen'in ilgili arama sonuçlarını bana geri verdiğinden nasıl emin olabilirim? Lucene ++ karakteri görmezden geliyor gibi görünüyor.Lucene aramada + özel karakter olarak işleme +

Kod ayrıntıları: Bu satırı yürüttüğümde boş bir arama sorgusu alıyorum. (QueryParser.Escape

indexSearcher.Search(searchQuery, collector); 

Ben queryField = multiFieldQueryParser.Parse çalıştım:

queryField = multiFieldQueryParser.Parse(inpKeywords); 

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

Ve burada benim özel analizörü:

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; 
     } 
} 

Ve arama sorgu bu şekilde yürütülmesi ediyorum (inpKeywords)), ancak hala çalışmıyor. İşte çalıştırılan sorgu ve sıfır isabetler döndürür. "+ (())"

Teşekkürler.

cevap

3

anlatıldığı gibi

Buna etkinleştirebilirsiniz. Kaçınılması gereken tüm karakterlerin listesi here (sayfanın altına bakın.)

Ayrıca, indeksleme sırasında kullandığınız analizöre de dikkat etmeniz gerekir. Örneğin, StandardAnalyzer +'u atlar. Dizin oluştururken ve arama yaparken WhiteSpaceAnalyzer gibi bir şey kullanmanız gerekebilir, bu da tokenstream'de özel karakterleri korur. Endeksleme ve arama yaparken aynı analiz cihazını kullanmanız gerektiğini unutmayın.

+0

WhiteSpaceAnalyzer sadece ... ama yinede + karakterler –

0

Arama sorgularınızı kodlayan UTF-8'i deneyin. , + özel bir karakter, o kaçtı gerekiyor olduğundan this article

+0

bağlantı çalışmıyorsa .... – Nirmal

1

Doğru analizörü seçmeye ek olarak, tüm özel karakterlerin düzgün şekilde kaçtığından emin olmak için QueryParser.Escape(string s)'u kullanabilirsiniz.

Bu, statik işlevi olduğu için, MultiFieldQueryParser kullansanız bile kullanabilirsiniz.

Örneğin, böyle bir şey deneyebilirsiniz:

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

sayesinde göz ardı edilir ur answer.Please başvurmak için kullanıyorum güncellenmiş soruma –

+0

Jesse.I yanıtı için tekrar teşekkürler Teşekkürler queryField = multiFieldQueryParser.Parse (QueryParser.Escape (inpKeywords)) ;, ama yine de çalışmıyor. Çalıştırılan ve sıfır isabet döndüren sorgu işte burada. "+ (())" –

+0

Hey Ed, Kaçış işlevi olmadan basit anahtar kelimeler için çalışıyor mu? Öyleyse, belki de Searcher ve QueryParser nesnelerinizle ilgili daha fazla kod yayınlayın. Ayrıca, endeksleme için kullandığınız aynı Analyzer ile arama yapmanız gerektiğini unutmayın. – Jesse