2013-02-22 31 views
6

Standardowy analizator nie działa. Z tego, co rozumiem, zmienia to na poszukiwanie c i net Działa, ale rozróżnia małe i wielkie litery.Jak dostosować Lucene.NET do wyszukiwania słów z symbolami bez rozróżniania wielkości liter (np. "C#" lub ".net")?

Ogólna zasada jest taka, że ​​wyszukiwanie powinno działać tak jak Google, więc mając nadzieję, że jest to konfiguracja, biorąc pod uwagę, że .net, c# było tam przez jakiś czas lub istnieje obejście tego problemu.

Zgodnie z poniższymi sugestiami próbowałem niestandardowego WhitespaceAnalyzer, ale następnie, jeśli słowa kluczowe są rozdzielane przecinkiem, a puste miejsca nie są obsługiwane poprawnie, np.

java,.net,c#,oracle 

nie zostaną zwrócone podczas wyszukiwania, co byłoby niepoprawne.

Natknąłem się na numer PatternAnalyzer, który służy do podziału tokenów, ale nie można go znaleźć w tym scenariuszu.

Używam Lucene.Net 3.0.3 i .NET 4.0

+0

to Twój kod źródłowy domeny? A może to tylko przykłady? – phani

+0

@phani to tylko przykłady – Kumar

Odpowiedz

-2

dla innych, którzy mogą być patrząc na odpowiedź, jak również

ostateczna odpowiedź okazała się być stworzenie niestandardowego TokenFilter i niestandardowego analizatora przy użyciu że Reklamowe filtra wraz z Whitespacetokenizer, lowercasefilter itp, w sumie około 30 linii kodu, utworzę wpis na blogu i opublikuję link tutaj, gdy to zrobię, najpierw trzeba utworzyć blog!

+0

Witam, czy mógłbyś opublikować go na Gist? Brzmi bardzo użytecznie – mcintyre321

7

Napisz własną klasę niestandardowego analizatora podobną do SynonymAnalyzer w Lucene.Net – Custom Synonym Analyzer. Zastąpienie TokenStream może rozwiązać ten problem przez potokowanie strumienia za pomocą WhitespaceTokenizer i LowerCaseFilter.

Pamiętaj, że twój indeksator i wyszukiwarka muszą używać tego samego analizatora.

Aktualizacja: obsługa wielu oddzielonych przecinkami słowa kluczowe

Jeśli tylko trzeba obsłużyć unspaced rozdzielany przecinkami słowa kluczowe dla szukają nie indeksowania następnie można przekształcić wyrażenie wyszukiwarki expr jak poniżej.

expr = expr.Replace(',', ' '); 

Następnie przechodzą expr do QueryParser. Jeśli chcesz obsługiwać inne ograniczniki, takie jak ";" można zrobić to tak:

var terms = expr.Split(new char[] { ',', ';'}); 
expr = String.Join(" ", terms); 

Ale trzeba także sprawdzić za pomocą wyrażenia frazy jak „Sybase, C# ,. netto, Oracle” (wyrażenie zawiera cytat "znaków), które nie powinny być zamienione (The użytkownik szuka dokładne dopasowanie):

expr = expr.Trim(); 
if (!(expr.StartsWith("\"") && expr.EndsWith("\""))) 
{ 
    expr = expr.Replace(',', ' '); 
} 

wyrażenie może zawierać zarówno frazy i słowa kluczowe, na przykład:

"sybase,c#,.net,oracle" server,c#,.net,sybase 

Następnie należy przeanalizować i przetłumaczyć wyrażenie przeszukiwanie do tego:

"sybase,c#,.net,oracle" server c# .net sybase 

Jeśli trzeba także obsługiwać unspaced rozdzielany przecinkami słowa kluczowe dla indeksowania to trzeba zanalizować tekst unspaced oddzielonych przecinkami słów kluczowych i przechowywać je w odrębną dziedzinę np. Keywords (który musi być powiązany z niestandardowym analizatorem).Wtedy twój obsługi wyszukiwania musi przekształcić wyrażenie wyszukiwarki tak:

server,c#,.net,sybase 

do tego:

Keywords:server Keywords:c# Keywords:.net, Keywords:sybase 

lub prościej:

Keywords:(server, c#, .net, sybase) 
+0

próbowałem, ale potem nie rozpoznaje się słów kluczowych, takich jak wyrocznia, .net, C#, sybase itp., Które są wykonywane przez google - złoty standard dla naszych użytkowników, jak to było, będzie wyglądać więcej informacji może być dostosowywanie tokenizator, jeśli to możliwe – Kumar

+0

Dodane szczegóły do ​​Ques – Kumar

+0

jest to potrzebne do wyszukiwania i indeksowania, ciekawego pomysłu na temat analizowania w oddzielnym polu, ale to byłoby więcej pracy, ponieważ musielibyśmy poradzić sobie powiedzieć .net4/.net4.5 itp. raczej niż wyszukiwanie w sieci .net * (ciche) itp. Jeśli nie potrafię wymyślić sposobu na dostosowanie tokenizera, to trzeba będzie zrobić coś takiego: – Kumar

4

Użyj WhitespacerAnalyzer i łańcucha to z LowerCaseFilter .

Użyj tego samego łańcucha w czasie wyszukiwania i indeksowania. konwertując wszystko na małe litery, sprawiasz, że wielkość liter jest niewrażliwa.

Zgodnie z opisem problemu, powinno to działać i być łatwe do wdrożenia.