2012-02-01 22 views
7

Używam analizatora kulek śnieżnych, aby powstrzymać tytuły wielu dokumentów. Wszystko działa dobrze, ale ich są jakieś dziwactwa.Używanie kombinacji symboli wieloznacznych i sprawdzania

przykład:

Szukaj „valv”, „zawór” lub „zawory” zwraca samą liczbę wyników. Ma to sens, ponieważ analizator kuli śnieżnej redukuje wszystko do "valv".

Występują problemy podczas używania wieloznacznika. Poszukiwanie "zaworu *" lub "zaworów *" nie zwraca żadnych wyników. Wyszukiwanie "valv *" działa zgodnie z oczekiwaniami.

Rozumiem, dlaczego tak się dzieje, ale nie wiem, jak to naprawić.

Pomyślałem o napisaniu analizatora, który przechowuje żetony z łodygami i bez łodygi. Zasadniczo zastosowanie dwóch analizatorów i połączenie dwóch strumieni tokenów. Ale nie jestem pewien, czy to jest praktyczne rozwiązanie.

Też myślałem o używaniu AnalyzingQueryParser, ale nie wiem jak zastosować to do kwantowego zapytania. Również użycie AnalyzingQueryParser zwróci wyniki dla "zaworu" podczas wyszukiwania "zaworów" i nie jest to oczekiwane zachowanie.

Czy istnieje "preferowany" sposób wykorzystania zarówno symboli wieloznacznych, jak i algorytmów rozstrzygania?

Odpowiedz

7

użyłem 2 różne podejścia do rozwiązywania tego wcześniej

  1. korzystać z dwóch pól, które zawierają jeden wynikały warunki, drugi zawierający warunki generowane przez powiedzmy, StandardAnalyzer. Po przeanalizowaniu zapytania, jeśli jest to wyszukiwanie wieloznaczne w polu "standardowym", w przeciwnym razie użyj pola z przypisanymi terminami. Może to być trudniejsze w użyciu, jeśli użytkownik wprowadzi swoje zapytania bezpośrednio w QueryParser Lucene.

  2. Napisz niestandardowy analizator i indeks pokrywający tokeny. Zasadniczo składa się z indeksowania pierwotnego terminu i trzpienia w tej samej pozycji w indeksie przy użyciu PositionIncrementAttribute. Możesz zajrzeć do SynonymFilter, aby uzyskać przykład prawidłowego korzystania z PositionIncrementAttribute.

Preferuję rozwiązanie nr 2.

+0

+1 dla drugiego rozwiązania, to najbardziej naturalny sposób robienia tego. –

1

Nie sądzę, że jest to łatwe (i poprawne) sposób, aby to zrobić.

Moje rozwiązanie byłoby pisanie niestandardowego analizatora zapytań, który znajdzie najdłuższy ciąg znaków wspólny dla warunków w indeksie i do twoich kryteriów wyszukiwania.

class MyQueryParser : Lucene.Net.QueryParsers.QueryParser 
{ 
    IndexReader _reader; 
    Analyzer _analyzer; 

    public MyQueryParser(string field, Analyzer analyzer,IndexReader indexReader) : base(field, analyzer) 
    { 
     _analyzer = analyzer; 
     _reader = indexReader; 
    } 

    public override Query GetPrefixQuery(string field, string termStr) 
    { 
     for(string longestStr = termStr; longestStr.Length>2; longestStr = longestStr.Substring(0,longestStr.Length-1)) 
     { 
      TermEnum te = _reader.Terms(new Term(field, longestStr)); 
      Term term = te.Term(); 
      te.Close(); 
      if (term != null && term.Field() == field && term.Text().StartsWith(longestStr)) 
      { 
       return base.GetPrefixQuery(field, longestStr); 
      } 
     } 

     return base.GetPrefixQuery(field, termStr); 
    } 
} 

można także spróbować zadzwonić do analizatora w GetPrefixQuery których nie jest wymagana PrefixQuery s

TokenStream ts = _analyzer.TokenStream(field, new StringReader(termStr)); 
Lucene.Net.Analysis.Token token = ts.Next(); 
var termstring = token.TermText(); 
ts.Close(); 
return base.GetPrefixQuery(field, termstring); 

Ale należy pamiętać, że zawsze można znaleźć przypadek, w którym zwracane wyniki nie są poprawne. Właśnie dlatego Lucene nie bierze pod uwagę analizatorów podczas używania symboli wieloznacznych.

+0

Naprawdę chciałbym znaleźć sposób na scalenie dwóch tokenów, dzięki czemu mógłbym otrzymać zestaw żetonów z łodygami i nie-łodygami ... Zajmę się tym trochę. Zaktualizuję, jeśli znajdę sposób. – SharpBarb

0

Jedyny potencjalny pomysł, jaki mam poza innymi odpowiedziami, to użycie zwarcia względem dwóch pól, więc możesz ustawić względne wagi dwóch pól. Jedynym zastrzeżeniem jest to, że niektóre wersje rozbrajające nie obsługiwały symboli wieloznacznych, a niektóre parsery są specyficzne dla Solr.

1

Jest to najprostsze rozwiązanie i to działa -

Dodaj solr.KeywordRepeatFilterFactory w „index” analizatora.

http://lucene.apache.org/core/4_8_0/analyzers-common/org/apache/lucene/analysis/miscellaneous/KeywordRepeatFilterFactory.html

dodać także RemoveDuplicatesTokenFilterFactory na koniec „index” analizatora

Teraz w indeksie będzie zawsze mają łodygach i nie wynikała formularz dla każdego żetonu na tej samej pozycji i jesteś dobrze iść.

Powiązane problemy