2017-01-30 1 views
0

Ich möchte Benutzer die Möglichkeit geben, Groß-und Kleinschreibung oder Groß-und Kleinschreibung zu beachten.Lucene, wie zwischen Groß- und Kleinschreibung zu wechseln

Meine Idee ist, verwenden Sie eine Groß-und Kleinschreibung Analyzer, um die Daten zu indizieren und dann empfindliche oder unempfindliche Analysator verwenden, um abhängig von Benutzereingaben zu suchen.

Also habe ich meine Groß- und Kleinschreibung Analysator und hier eine einfache meiner Code ist:

public final class CaseSensitiveStandardAnalyzer extends StopwordAnalyzerBase { 
    @Override 
    protected TokenStreamComponents createComponents(final String fieldName, final Reader reader) { 
    final StandardTokenizer src = new StandardTokenizer(matchVersion, reader); 
    src.setMaxTokenLength(maxTokenLength); 
    TokenStream tok = new StandardFilter(matchVersion, src); 
    tok = new StopFilter(matchVersion, tok, stopwords); 
    return new TokenStreamComponents(src, tok) { 
     @Override 
     protected void setReader(final Reader reader) throws IOException { 
     src.setMaxTokenLength(CaseSensitiveStandardAnalyzer.this.maxTokenLength); 
     super.setReader(reader); 
     } 
    }; 
    } 

Für die Indizierung ich benutzten:

Analyzer analyzer = new CaseSensitiveStandardAnalyzer(Version.LUCENE_46); 
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_46,analyzer); 
IndexWriter indexWriter = new IndexWriter(indexDir,config); 
indexWriter.addDocument(document); 

Für die Suche habe ich:

Analyzer analyzer; 
if(caseSentive) 
    analyzer = new CaseSensitiveStandardAnalyzer(Version.LUCENE_46); 
else 
    analyzer = new StandardAnalyzer(Version.LUCENE_46); 
QueryParser queryParser = new QueryParser(Version.LUCENE_46,"content", analyzer); 
Query query = queryParser.parse(searchString); 
//Search 
TopDocs results = indexSearcher.search(query,10000); 
ScoreDoc[] hits = results.scoreDocs; 

Wenn ich das müde, funktionierte der sensible Fall, aber der unempfindliche Fall nicht.

Nach mehr Forschung, fand ich, dass die Verwendung eines Groß-und Kleinschreibung-Analyse mit einer Abfrage niedriger Sorgfalt nicht funktioniert. Case-sensitive Analyzer indiziert arbeiten mit Groß-und Kleinschreibung und Groß-und Kleinschreibung-Analyse-indizierten Arbeit mit case-insensitive Abfrage, kann jemand bestätigen dies?

Es scheint mir der einzige zuverlässige Weg, um sowohl Groß-und Kleinschreibung und Groß-und Kleinschreibung zu finden ist zweimal Index, für jeden Fall, ist das richtig?

Antwort

0

Es scheint mir die einzige zuverlässige Möglichkeit, sowohl Groß-und Kleinschreibung und Groß-und Kleinschreibung zu suchen, ist zweimal indizieren, eine für jeden Fall, ist das korrekt?

, dass eine mögliche Lösung wäre, aber es gibt optimalere Lösungen für diesen Anwendungsfall: https://stackoverflow.com/a/2490441/867816

Dies könnte auch helfen: http://www.hascode.com/2014/07/lucene-by-example-specifying-analyzers-on-a-per-field-basis-and-writing-a-custom-analyzertokenizer/

Verwandte Themen