2017-12-20 4 views
0

Nehmen wir an, ich habe eine Liste von Dokumenten in Lucene Index, wo ich Keywords/Phrasen wie diese konfiguriert haben.Wie prozentuale Übereinstimmung zwischen der Liste der Strings in Apache Lucene

Hier Titel ist ein Feld und Inhalt ist ein Feld. jetzt meine Eingabe ist

dies eine Benachrichtigung von Facebook ist

so das Ergebnis für die folgende Meldung sein sollte,

keine Treffer: 2

Prozentsatz Spiel : 100% (Ursache beide konfigurierten Schlüsselwörter stimmen vollständig überein)

jetzt meint ein anderer Eingang ist,

Misconfiguration

so konfiguriert ist hier mitgeteilt wurde, die Meldung 12 Zeichen hat .und in Nachricht informiert wird, in dem nur 6 Zeichen nur passend so (6/12 * 100) was sollte 50%.

so möchte ich eine Ausgabe wie diese Teil Spiel Aufgetreten und der Prozentsatz Spiel 50%

+0

Sie markiert haben alle drei - solr, elastisch und Lucene. Was nimmst du eigentlich und was hast du bisher probiert? –

+0

Momentan benutze ich Lucene. und ich habe versucht, die prozentuale Übereinstimmung auf der Basis der Übereinstimmung der Termabfrage zu berechnen, aber das hilft nicht viel. –

Antwort

0

irgendwie meine Lösung für den Prozentsatz Spiel dies ist

public class lab1 { 
    public static double similarity(String s1, String s2) { 
    String longer = s1, shorter = s2; 
    if (s1.length() < s2.length()) { // longer should always have greater length 
     longer = s2; shorter = s1; 
    } 
    int longerLength = longer.length(); 
    if (longerLength == 0) { return 1.0; /* both strings are zero length */ } 
    /* // If you have Apache Commons Text 
    // you can use it to calculate the edit distance: 
    LevenshteinDistance levenshteinDistance = new LevenshteinDistance(); 
    return (longerLength - levenshteinDistance.apply(longer, shorter))/(double) longerLength; */ 
    return (longerLength - editDistance(longer, shorter))/(double) longerLength; 

    } 

    public static int editDistance(String s1, String s2) { 
    s1 = s1.toLowerCase(); 
    s2 = s2.toLowerCase(); 

    int[] costs = new int[s2.length() + 1]; 
    for (int i = 0; i <= s1.length(); i++) { 
     int lastValue = i; 
     for (int j = 0; j <= s2.length(); j++) { 
     if (i == 0) 
      costs[j] = j; 
     else { 
      if (j > 0) { 
      int newValue = costs[j - 1]; 
      if (s1.charAt(i - 1) != s2.charAt(j - 1)) 
       newValue = Math.min(Math.min(newValue, lastValue), 
        costs[j]) + 1; 
      costs[j - 1] = lastValue; 
      lastValue = newValue; 
      } 
     } 
     } 
     if (i > 0) 
     costs[s2.length()] = lastValue; 
    } 
    return costs[s2.length()]; 
    } 

    public static void printSimilarity(String s, String t) { 
    System.out.println(String.format(
     "%.3f Percent is the similarity between \"%s\" and \"%s\"", similarity(s, t)*100, s, t)); 
    } 

    public static void main(String[] args) { 
    printSimilarity("", ""); 
    printSimilarity("1234567890", "1"); 
    printSimilarity("1234567890", "123"); 
    printSimilarity("1234567890", "1234567"); 
    printSimilarity("1234567890", "1234567890"); 
    printSimilarity("1234567890", "1234567980"); 
    printSimilarity("47/2010", "472010"); 
    printSimilarity("47/2010", "472011"); 
    printSimilarity("47/2010", "AB.CDEF"); 
    printSimilarity("47/2010", "4B.CDEFG"); 
    printSimilarity("47/2010", "AB.CDEFG"); 
    printSimilarity("The quick fox jumped", "The jumped fox"); 
    printSimilarity("The quick fox jumped", "The fox"); 
    printSimilarity("kitten", "sitting"); 
    } 

} 
Verwandte Themen