2012-02-24 19 views
7

Am nadzieję, że ktoś z dość wgląd w wewnętrzne funkcjonowanie Lucene może być w stanie wskazać mi w dobrym kierunku =)TermQuery nie wraca na znanej wyszukiwania wyrażenia, ale WildcardQuery robi

Pominę większość otaczający nieodpowiedzialny kod i przeciąć prawo do pościgu. Mam indeks Lucene, do której dodaję następujące pola do indeksu (zmienne zastąpione przez ich wartości dosłowne):

document.Add(new Field("Typenummer", "E5CEB501A244410EB1FFC4761F79E7B7", 
         Field.Store.YES , Field.Index.UN_TOKENIZED)); 

Później, kiedy szukać mojego indeksu (przy użyciu innych typów kwerend), jestem w stanie zweryfikować, że to pole rzeczywiście pojawiają się w moim indeksie - jak wtedy, gdy zapętlenie poprzez wszystkie pola zwróconych przez Document.GetFields()

Field: Typenummer, Value: E5CEB501A244410EB1FFC4761F79E7B7 

tej pory tak dobrze :-)

teraz prawdziwym problemem jest - dlaczego nie mogę użyć TermQuery, aby przeszukać tę wartość i faktycznie uzyskać resu lt.

Ten kod daje 0 klikniecia:

// Returns 0 hits 
bq.Add(new TermQuery(new Term("Typenummer", 
     "E5CEB501A244410EB1FFC4761F79E7B7")), BooleanClause.Occur.MUST); 

Ale jeśli mogę zmienić to do WildcardQuery (bez symboli wieloznacznych), otrzymuję 1 hit spodziewam.

// returns the 1 hit I expect 
bq.Add(new WildcardQuery(new Term("Typenummer", 
     "E5CEB501A244410EB1FFC4761F79E7B7")), BooleanClause.Occur.MUST); 

Sprawdziłem długości pól, mam zaznaczone, że używam tego samego analizatora i tak dalej i wciąż jestem na placu 1, dlaczego to jest.

Czy ktoś może wskazać mi kierunek, w którym powinienem patrzeć?

+2

Nie jestem zbyt obeznany z Lucene.net, ale w przypadku, gdy używa on tej samej struktury indeksu co wersja Java, możesz użyć Luke http://code.google.com/p/luke/, aby sprawdzić, czy twój indeks Struktura spełnia Twoje oczekiwania.Alternatywnie, czy mógłbyś sprawdzić, czy TermsIndex # seekExact udaje się znaleźć Twój termin? – jpountz

Odpowiedz

8

W końcu zorientowałem się, co się dzieje. Ja rozszerza znaczniki na to pytanie, gdyż, ku mojemu zdziwieniu, rzeczywiście okazał się być problem z CMS to szczególny problem istnieje w Podsumowując, problem sprowadza się do tego:.

  1. pole jest przechowywany UN_TOKENIZED, czyli Lucene będzie go przechowywać excactly „jak jest”
  2. BooleanQuery I wklejać fragmenty z zostaje wysłany do Sitecore SearchManager wewnątrz PreparedQuery wrapper
  3. zachowanie się spodziewałem z tego było, że moje zapytanie (po przygotowaniu) przejdzie - niezmieniony - do Lucene API
  4. Okazuje się, że się myliłem. Przechodzi on przez metodę RewriteQuery, która kopiuje cały zestaw zapytań zagnieżdżonych bez zmian - z wyjątkiem jednego - wszystkie argumenty Term są przekazywane za pomocą SmallcaseStrategy()
  5. Gdy indeksowałem termin WIELKOŚĆ LITERY (UN_TOKENIZED), a Sitecore zmienia moje PreparedQuery na małe - 0 wyniki są zwracane

nie zamierzam rozpocząć argument czy to jest „projektem” lub „przez błąd konstrukcyjny” Wdrożenie API Lucene Wrapper - będę tylko pamiętać, że przepisywanie Moje strony zapytanie przy użyciu przeciążenia PreparedQuery jest ... dla mnie ... nieoczekiwane ;-)

Dalsze nauki z tego; przechowywanie pola jako TOKENIZED wyeliminuje również ten problem, ponieważ StandardAnalyzer domyślnie będzie malował wszystkie tokeny.

+0

Bardzo dobrze wiedzieć –

+0

Wpadłem na podobny problem z Lucene.NET. Ten wpis uratował mi utracone dzięki dzięki. – RationalGeek

+0

@mark Cassidy Wow. Twój jedyny, który omawia ten problem. Mam podobny problem. Próbuję filtrować wartość przed przekazaniem jej do wyszukiwania. Filter filter = new QueryWrapperFilter (new WildcardQuery (new Term (field1, "005NWVOXDYN3U0V6")); Wartości tekstowe nie działają w tym filtrze. Jednak liczby działają. Próbowałem nawet TermQuery, ale ten sam wynik. Czy możesz mi pomóc w tym problemie? – Huzaifa

Powiązane problemy