2012-03-27 11 views
14

Próbuję zrobić niewyraźne wyszukiwanie "jahngir" ~ 0.2, które nie zwraca żadnych wyników. Moje indeksy mają zapisy z danymi "JAHANGIR RAHMAN MD". Jeśli spróbuję wyszukiwania z dokładnym słowem "jahangir" ~ 0.2, to działa. Czy ktoś może mi pomóc, co robię źle. Spędziłem dużo czasu próbując dowiedzieć się, jak działa wyszukiwanie Solr Fuzzy. Pomocne będą wszelkie linki wyjaśniające wyszukiwanie Solr Fuzzy. Poniżej znajduje się pole tekstowe, którego używam do indeksowania. Z góry dziękuję.Solr Fuzzy Wyszukaj podobne słowa

<fieldType name="text" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <!-- in this example, we will only use synonyms at query time 
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> 
    --> 
    <!-- Case insensitive stop word removal. 
     add enablePositionIncrements=true in both the index and query 
     analyzers to leave a 'gap' for more accurate phrase queries. 
    --> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      enablePositionIncrements="true" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
    <filter class="solr.PorterStemFilterFactory"/> 
    <filter class="solr.CommonGramsFilterFactory" words="stopwords.txt" ignoreCase="true"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/> 
    <filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone" inject="false"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      enablePositionIncrements="true" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
    <filter class="solr.PorterStemFilterFactory"/> 
    <filter class="solr.CommonGramsFilterFactory" words="stopwords.txt" ignoreCase="true"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/> 
    <filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone" inject="false"/> 
    </analyzer> 
</fieldType> 

Oto konfiguracja który pracował dla mnie po odpowiedzi. Dzięki!

<!-- Modified to fit fuzzy queries --> 
    <fieldType name="text_exact_fuzzy" class="solr.TextField" omitNorms="false"> 
     <analyzer type="index"> 
      <tokenizer class="solr.StandardTokenizerFactory"/> 
      <filter class="solr.StandardFilterFactory"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StandardFilterFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 
    </fieldType> 
+0

Jaką implementację wyszukiwania używasz? FST, WFST lub Jaspell? – Chiron

+0

A jak wysyłasz prośbę do Solr? Zdefiniowałeś Lub wysyłasz przez "wybierz" punkt końcowy "? – Chiron

+0

Chiron - Żądanie zostanie wysłane przy użyciu wybranego punktu końcowego. – Ravi

Odpowiedz

18

Nie, nie trzeba włączać funkcji osłabiania, a przyczyną może być użycie trzpienia.

Masz za dużo filtrów w polu tekstowym. Przekształcasz słowo na łan Portera, które często nie jest prawdziwym słowem, a następnie bierzesz klucz fonetyczny. Słowo powierzchniowe rzadko będzie pasować do klucza fonetycznego zapisanego w indeksie. Klucz fonetyczny będzie bardzo różnił się od oryginalnego słowa.

Użyj strony analizatora w interfejsie administratora, aby zobaczyć, jak przetwarzane są warunki.

Polecam podzielenie rodzaju przybliżonego dopasowania na różne pola.

  • text_exact: małe, że chodzi o to
  • text_stem: małymi literami i macierzystych
  • text_phonetic: małe litery i podwójne Metaphone, nie wynikają

Używaj rozmyty dopasowanie z text_exact, ponieważ obsługuje wpisywanie błędy. Nie używaj rozmycia na innych polach.

Możesz ważyć te pola w różny sposób, dokładne dopasowanie jest meczem o wyższej jakości niż reszta, więc może mieć większą wagę. Wynikowy mecz jest lepszy od fonetycznego, więc powinien mieć masę mniejszą niż dokładna, ale większą niż fonetyczną.

+0

Wielkie dzięki! Uderzyłeś paznokciem w głowę. Spędzałem dużo czasu próbując dowiedzieć się, w jaki sposób wyszukiwanie rozmyte i czynnik podobieństwa działają z Solr.Twoje zalecenie podzielenia go na różne typy pól i użycie dopasowania text_exact do wyszukiwania rozmytego pomogło w lepszym zrozumieniu tego, jak to działa! – Ravi

+0

Ravi, czy możesz udostępnić swoją ostateczną konfigurację? – Mateusz

+1

Oto moja ostateczna konfiguracja. \t \t \t \t Ravi

0

W celu uzyskania Fuzzy szukane pracować, trzeba umożliwić poprawną wynikających i/lub filtr fabrycznym dla żądanego języka. Aby uzyskać więcej informacji, zobacz temat Langauge Analysis na stronie Solr Wiki.

Edit: Proszę zobaczyć Analyzers, Tokenizers and Token Filters uzyskać więcej informacji na temat różnych sposobów indeksowania danych i jak to wpływa na poszukiwaniu danych.

+0

Dzięki za odpowiedź. Dobrze wiedzieć, że fabryka filtra ingerującego wpływa na wyszukiwanie rozmyte. W powyższym polu używam już PorterStemFilterFactory. Czy powinienem zmienić to na coś innego? Jakie są inne czynniki, które mogą wpłynąć na wyszukiwanie Fuzzy. – Ravi

+0

Proszę zobaczyć aktualizację w mojej odpowiedzi, aby uzyskać więcej informacji. –